text:
/**
 * tek.js
 * - javascript library for tek -
 * @version v0.3.7
 * @author Taka Okunishi
 * @license MIT
 * @date 2013-11-30
 */
(function (tek) {

	/**
	 * define newable function
	 * @type {Function}
	 */
	tek.define = (function () {
	    function addProperty(F, property) {
	        for (var name in property) {
	            if (!property.hasOwnProperty(name)) continue;
	            F.prototype[name] = property[name];
	        }
	    }

	    function addAttrAccessor(F, attrs) {
	        if (!(attrs instanceof Array)) attrs = [attrs];

	        function createAccessor(key) {
	            return function () {
	                var s = this;
	                if (arguments.length) {
	                    s[key] = arguments[0];
	                    return s;
	                } else {
	                    return s[key];
	                }
	            }
	        }

	        for (var i = 0, len = attrs.length; i < len; i++) {
	            var attr = attrs[i],
	                value_key = ('_' + attr);
	            if (F.prototype[value_key] === undefined) {
	                F.prototype[value_key] = null;
	            }
	            F.prototype[attr] = createAccessor(value_key);
	        }
	        return F;
	    }

	    return function (def) {
	        var F = function () {
	            var s = this;
	            s.init && s.init.apply(s, arguments);
	        };
	        var prototype = def['prototype'] || def['Prototype'];
	        if (prototype) F.prototype = new prototype;

	        var properties = def['properties'] || def['property'] || {};
	        addProperty(F, properties);

	        var init = def['init'];
	        if (init) F.prototype.init = init;

	        var attrAccessor = def['attrAccessor'] || def['attrAccessors'] || [];
	        addAttrAccessor(F, attrAccessor);

	        return F;
	    };
	})();

	/**
	 * generate uuid
	 */
	tek.uuid = (function () {
	    function s4() {
	        return Math.floor((1 + Math.random()) * 0x10000)
	            .toString(16)
	            .substring(1);
	    }

	    return function () {
	        return [s4() + s4(), s4(), s4(), s4(), s4() + s4() + s4()].join('-');
	    }
	})();

	tek.Query = function (string) {
	    if (!string) return;
	    string = string.replace(/^\?/, '');
	    var s = this;
	    var isQuery = s instanceof tek.Query;
	    if (!isQuery) {
	        return new tek.Query(string);
	    }
	    var queries = string.split('&');
	    for (var i = 0, len = queries.length; i < len; i++) {
	        var query = queries[i];
	        var key_val = query.split('=');
	        var key = decodeURIComponent(key_val[0]);
	        s[key] = decodeURIComponent(key_val[1].replace(/\+/g, ' '));
	    }
	    return s;
	};

	tek.Query.fromLocation = function (location) {
	    var search = location.search;
	    return search && tek.Query(search.replace(/^\?/, ''));
	};

	/**
	 * save data to local storage
	 * @param key
	 * @param obj
	 */
	tek.toStorage = function (key, obj) {
	    var isString = typeof (obj) === 'string',
	        string = isString ? obj : JSON.stringify(obj);
	    localStorage.setItem(key, string);
	};

	/**
	 * restore data from local storage
	 * @param key
	 * @returns {*}
	 */
	tek.fromStorage = function (key) {
	    var string = localStorage.getItem(key);
	    return JSON.parse(string);
	};

	tek.math = {};
	/**
	 * make sure to values to iteratable
	 * @param values
	 * @returns {*}
	 */
	tek.ensureIteratable = function (values) {
	    switch (values.length) {
	        case 0:
	            return null;
	        case 1:
	            var $0 = values[0];
	            if ($0 instanceof Array) {
	                return $0
	            } else {
	                return [$0];
	            }
	        default :
	            return Array.prototype.slice.call(values, 0);
	    }
	};

	/**
	 * get largest value
	 * @returns {null}
	 */
	tek.math.max = function () {
	    var max = null,
	        values = tek.ensureIteratable(arguments);
	    for (var i = 0, len = values.length; i < len; i++) {
	        var value = values[i];
	        if (max === null) {
	            max = value;
	        } else if (max < value) {
	            max = value;
	        }
	    }
	    return max;
	};

	/**
	 * get smallest value
	 * @returns {null}
	 */
	tek.math.min = function () {
	    var min = null,
	        values = tek.ensureIteratable(arguments);
	    for (var i = 0, len = values.length; i < len; i++) {
	        var value = values[i];
	        if (min === null) {
	            min = value;
	        } else if (value < min) {
	            min = value;
	        }
	    }
	    return min;
	};

	/**
	 * get sum of values
	 * @returns {number}
	 */
	tek.math.sum = function () {
	    var sum = 0,
	        values = tek.ensureIteratable(arguments);
	    for (var i = 0, len = values.length; i < len; i++) {
	        sum += values[i];
	    }
	    return sum;
	};

	/**
	 * get average of values
	 * @returns {number}
	 */
	tek.math.average = function () {
	    var values = tek.ensureIteratable(arguments);
	    var len = values.length;
	    var sum = tek.math.sum(values);
	    return  len ? (sum / len) : null;
	};

	/**
	 * composite functions
	 * @returns {Function}
	 */
	tek.composite = function (/**functions**/) {
	    var callables = Array.prototype.slice.call(arguments, 0);
	    return function () {
	        var s = this,
	            result = [];
	        for (var i = 0, len = callables.length; i < len; i++) {
	            var callable = callables[i];
	            var called = callable && callable.apply(s, arguments);
	            result = result.concat(called);
	        }
	        return result;
	    };
	};

	/**
	 * User: okunishitaka
	 * Date: 9/16/13
	 * Time: 3:36 PM
	 */

	/**
	 * copy properties
	 * @param src
	 * @param dst
	 */
	tek.copy = function (src, dst) {
	    for (var name in src) {
	        if (!src.hasOwnProperty(name)) continue;
	        dst[name] = src[name];
	    }
	    return dst;
	};

	/**
	 * recursive copy
	 * @param src
	 * @param dst
	 * @returns {*}
	 */
	tek.copy.deep = function (src, dst) {
	    var copy = tek.copy;
	    if (!src) return dst;
	    for (var key in src) {
	        if (!src.hasOwnProperty(key)) continue;
	        if (src[key] instanceof Date) {
	            dst[key] = new Date(src[key]);
	        } else if (src[key] instanceof Function) {
	            dst[key] = src[key];
	        } else {
	            if (src[key] instanceof Array) {
	                dst[key] = copy.deep(src[key], dst[key] || []);
	            } else if (src[key] instanceof Object) {
	                dst[key] = copy.deep(src[key], dst[key] || {});
	            } else {
	                dst[key] = src[key];
	            }
	        }
	    }
	    return dst;
	};

	var crossBrowser = tek.crossBrowser = function (window) {
	    crossBrowser.fallbackObject(window.Object);
	    crossBrowser.fallbackArray(window.Array);
	    crossBrowser.fallbackString(window.String);
	    crossBrowser.fallbackWindow(window);
	    crossBrowser.fallbackNavigator(window.navigator || {});
	    return window;
	};
	crossBrowser.fallbackWindow = function (window) {
	    var fallbacks = crossBrowser.fallbackWindow.fallbacks;
	    if (!window.requestAnimationFrame) window.requestAnimationFrame = fallbacks.requestAnimationFrameFallback(window);
	    if (!window.URL) window.URL = fallbacks.URLFallback(window);
	};
	crossBrowser.fallbackWindow.fallbacks = {
	    requestAnimationFrameFallback: function (window) {
	        return window.requestAnimationFrame ||
	            window.webkitRequestAnimationFrame ||
	            window.mozRequestAnimationFrame ||
	            window.oRequestAnimationFrame ||
	            window.msRequestAnimationFrame ||
	            function (callback) {
	                window.setTimeout(callback, 1000 / 60);
	            };
	    },
	    URLFallback: function (window) {
	        return window.URL || window.webkitURL || window.mozURL || window.msURL;
	    }
	};

	crossBrowser.fallbackNavigator = function (navigator) {
	    var fallbacks = crossBrowser.fallbackNavigator.fallbacks;
	    if (!navigator.getUserMedia) navigator.getUserMedia = fallbacks.getUserMediaFallback(navigator);
	};
	crossBrowser.fallbackNavigator.fallbacks = {
	    getUserMediaFallback: function (navigator) {
	        return navigator.getUserMedia ||
	            navigator.webkitGetUserMedia ||
	            navigator.mozGetUserMedia ||
	            navigator.msGetUserMedia;
	    }
	};

	crossBrowser.fallbackObject = function (Object) {
	    var fallbacks = crossBrowser.fallbackObject.fallbacks;
	    Object.keys = Object.keys || fallbacks.keysFallback;
	};
	crossBrowser.fallbackObject.fallbacks = {
	    keysFallback: (function () {
	        'use strict';
	        var hasOwnProperty = Object.prototype.hasOwnProperty,
	            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
	            dontEnums = [
	                'toString',
	                'toLocaleString',
	                'valueOf',
	                'hasOwnProperty',
	                'isPrototypeOf',
	                'propertyIsEnumerable',
	                'constructor'
	            ],
	            dontEnumsLength = dontEnums.length;

	        return function (obj) {
	            if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
	                throw new TypeError('Object.keys called on non-object');
	            }

	            var result = [], prop, i;

	            for (prop in obj) {
	                if (hasOwnProperty.call(obj, prop)) {
	                    result.push(prop);
	                }
	            }

	            if (hasDontEnumBug) {
	                for (i = 0; i < dontEnumsLength; i++) {
	                    if (hasOwnProperty.call(obj, dontEnums[i])) {
	                        result.push(dontEnums[i]);
	                    }
	                }
	            }
	            return result;
	        };
	    })()
	};

	crossBrowser.fallbackArray = function (Array) {
	    var fallbacks = crossBrowser.fallbackArray.fallbacks;
	    Array.prototype.map = Array.prototype.map || fallbacks.mapFallback;
	    Array.prototype.reduce = Array.prototype.reduce || fallbacks.reduceFallback;
	    Array.prototype.filter = Array.prototype.filter || fallbacks.filterFallback;
	    Array.prototype.forEach = Array.prototype.forEach || fallbacks.forEachFallback;
	};
	crossBrowser.fallbackArray.fallbacks = {
	    mapFallback: function (callback, thisArg) {

	        var T, A, k;

	        if (this == null) {
	            throw new TypeError(" this is null or not defined");
	        }

	        // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
	        var O = Object(this);

	        // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
	        // 3. Let len be ToUint32(lenValue).
	        var len = O.length >>> 0;

	        // 4. If IsCallable(callback) is false, throw a TypeError exception.
	        // See: http://es5.github.com/#x9.11
	        if (typeof callback !== "function") {
	            throw new TypeError(callback + " is not a function");
	        }

	        // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
	        if (thisArg) {
	            T = thisArg;
	        }

	        // 6. Let A be a new array created as if by the expression new Array(len) where Array is
	        // the standard built-in constructor with that name and len is the value of len.
	        A = new Array(len);

	        // 7. Let k be 0
	        k = 0;

	        // 8. Repeat, while k < len
	        while (k < len) {

	            var kValue, mappedValue;

	            // a. Let Pk be ToString(k).
	            //   This is implicit for LHS operands of the in operator
	            // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
	            //   This step can be combined with c
	            // c. If kPresent is true, then
	            if (k in O) {

	                // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
	                kValue = O[ k ];

	                // ii. Let mappedValue be the result of calling the Call internal method of callback
	                // with T as the this value and argument list containing kValue, k, and O.
	                mappedValue = callback.call(T, kValue, k, O);

	                // iii. Call the DefineOwnProperty internal method of A with arguments
	                // Pk, Property Descriptor {Value: mappedValue, : true, Enumerable: true, Configurable: true},
	                // and false.

	                // In browsers that support Object.defineProperty, use the following:
	                // Object.defineProperty(A, Pk, { value: mappedValue, writable: true, enumerable: true, configurable: true });

	                // For best browser support, use the following:
	                A[ k ] = mappedValue;
	            }
	            // d. Increase k by 1.
	            k++;
	        }

	        // 9. return A
	        return A;
	    },
	    reduceFallback: function (callback, opt_initialValue) {
	        'use strict';
	        if (null === this || 'undefined' === typeof this) {
	            // At the moment all modern browsers, that support strict mode, have
	            // native implementation of Array.prototype.reduce. For instance, IE8
	            // does not support strict mode, so this check is actually useless.
	            throw new TypeError(
	                'Array.prototype.reduce called on null or undefined');
	        }
	        if ('function' !== typeof callback) {
	            throw new TypeError(callback + ' is not a function');
	        }
	        var index, value,
	            length = this.length >>> 0,
	            isValueSet = false;
	        if (1 < arguments.length) {
	            value = opt_initialValue;
	            isValueSet = true;
	        }
	        for (index = 0; length > index; ++index) {
	            if (this.hasOwnProperty(index)) {
	                if (isValueSet) {
	                    value = callback(value, this[index], index, this);
	                }
	                else {
	                    value = this[index];
	                    isValueSet = true;
	                }
	            }
	        }
	        if (!isValueSet) {
	            throw new TypeError('Reduce of empty array with no initial value');
	        }
	        return value;
	    },
	    filterFallback: function (fun /*, thisp*/) {
	        'use strict';

	        if (!this) {
	            throw new TypeError();
	        }

	        var objects = Object(this);
	        var len = objects.length >>> 0;
	        if (typeof fun !== 'function') {
	            throw new TypeError();
	        }

	        var res = [];
	        var thisp = arguments[1];
	        for (var i in objects) {
	            if (objects.hasOwnProperty(i)) {
	                if (fun.call(thisp, objects[i], i, objects)) {
	                    res.push(objects[i]);
	                }
	            }
	        }

	        return res;
	    },
	    forEachFallback: function (fn, scope) {
	        'use strict';
	        var i, len;
	        for (i = 0, len = this.length; i < len; ++i) {
	            if (i in this) {
	                fn.call(scope, this[i], i, this);
	            }
	        }
	    }
	}
	;
	crossBrowser.fallbackString = function (String) {
	    var fallbacks = crossBrowser.fallbackString.fallbacks;
	    String.prototype.trim = String.prototype.trim || fallbacks.trim;
	};
	crossBrowser.fallbackString.fallbacks = {
	    trim: function () {
	        return this.replace(/^\s+|\s+$/g, '');
	    }
	};

	tek.Vector = tek.define({
	    init: function (values) {
	        var s = this;
	        for (var key in values) {
	            if (!values.hasOwnProperty(key)) continue;
	            s[key] = values[key];
	        }
	    },
	    attrAccessor: "".split(','),
	    properties: {
	        add: function (values) {
	            var s = this;
	            for (var key in s) {
	                if (!s.hasOwnProperty(key)) continue;
	                if (!values.hasOwnProperty(key)) continue;
	                s[key] += values[key];
	            }
	            return s;
	        },
	        scale: function (scale) {
	            var s = this;
	            for (var key in s) {
	                if (!s.hasOwnProperty(key)) continue;
	                s[key] = s[key] * scale;
	            }
	            return s;
	        },
	        revert: function () {
	            var s = this;
	            for (var key in s) {
	                if (!s.hasOwnProperty(key)) continue;
	                s[key] *= -1;
	            }
	            return s;
	        },
	        clone: function () {
	            var s = this;
	            return new tek.Vector(s);
	        }
	    }
	});
	tek.Vector.between = function (from, to) {
	    var Vector = tek.Vector;
	    return new Vector(to).clone().add(new Vector(from).clone().revert());
	};

	tek.Animation = tek.define({
	    init: function (from, to) {
	        var Vector = tek.Vector;
	        var s = this;
	        s.from = new Vector(from);
	        s.to = new Vector(to);
	        s.scope = Vector.between(from, to);
	    },
	    attrAccessor: "cursor,frameCount,done".split(','),
	    properties: {
	        _done: false,
	        _frameCount: 100,
	        _cursor: 0, /** indicates current position. 0 ~ 1**/
	        value: function () {
	            var s = this,
	                scale = s.ease(s._cursor);
	            return s.from.clone().add(s.scope.clone().scale(scale));
	        },
	        ease: function (proceed) {
	            //TODO
	            return proceed;
	        },
	        next: function () {
	            var s = this,
	                value = s.value();
	            s.move(1 / s._frameCount);
	            return value;
	        },
	        move: function (amount) {
	            var s = this;
	            s._cursor += amount;
	            if (s._cursor >= 1) {
	                s._done = true;
	                s._cursor = 1;
	            }
	        },
	        start: function (requestAnimationFrame, duration, callback) {
	            if (typeof(arguments[1]) === 'function') {
	                callback = arguments[1];
	                duration = 1500;
	            }
	            var s = this;
	            var startTime = new Date;
	            s._done = false;
	            s._cursor = 0;
	            (function loop() {
	                var t = new Date - startTime;
	                s.move(t / duration - s._cursor);
	                callback(s.value(), s._done);
	                if (!s._done) requestAnimationFrame(loop);
	            })();
	        }
	    }
	});
	tek.toSVG = function (html, w, h) {
	    if (typeof(Blob) === undefined) return null;
	    var svg = "<svg xmlns='http://www.w3.org/2000/svg' width='" + w + "' height='" + h + "'>" +
	        "<foreignObject width='100%' height='100%'>" +
	        "
" +
	        html +
	        "
" +
	        "</foreignObject>" +
	        "</svg>";
	    return  new Blob([svg], {type: "image/svg+xml;charset=utf-8"});
	};
	/**
	 * filter to unique values
	 */
	tek.unique = function (values) {
	    var isArray = values instanceof Array;
	    if (!isArray) values = Array.prototype.splice.call(arguments, 0);
	    return values.filter(function (entry, i) {
	        var first = values.indexOf(entry);
	        return first === i;
	    });
	};
	/**
	 * User: okunishitaka
	 * Date: 9/16/13
	 * Time: 12:14 AM
	 */

	var PATTERNS = {
	    ZENKAKU: /[!-~]/g,
	    HANKAKU: /[\!-\~]/g,
	    HIRAGANA: /[ぁ-ん]/g,
	    KATAKANA: /[ァ-ン]/g
	};
	tek.string = {};
	/**
	 * ひらがなへ変換
	 * @param str
	 * @returns {*}
	 */
	tek.string.toHiragana = function (str) {
	    return str && str.replace(PATTERNS.KATAKANA, function (s) {
	        return String.fromCharCode(s.charCodeAt(0) - 0x60);
	    });
	};

	/**
	 * カタカナへ変換
	 * @param str
	 * @returns {*}
	 */
	tek.string.toKatakana = function (str) {
	    return str && str.replace(PATTERNS.HIRAGANA, function (s) {
	        return String.fromCharCode(s.charCodeAt(0) + 0x60);
	    });
	};

	/**
	 * 半角へ変換
	 * @param str
	 * @returns {*}
	 */
	tek.string.toHankaku = function (str) {
	    return str && str.replace(PATTERNS.ZENKAKU, function (s) {
	        return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
	    });
	};

	/**
	 * 全角へ変換
	 * @param str
	 * @returns {*}
	 */
	tek.string.toZenkaku = function (str) {
	    return str && str.replace(PATTERNS.HANKAKU, function (s) {
	        return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
	    });
	};

	/**
	 * 曖昧一致
	 */
	tek.string.ambiguousMatch = function (searchWord, pattern) {
	    if (!pattern) return false;
	    if (!searchWord) return false;
	    searchWord = searchWord.trim();

	    var string = tek.string;
	    return pattern.match(searchWord) ||
	        string.toHankaku(pattern).match(searchWord) ||
	        string.toZenkaku(pattern).match(searchWord) ||
	        string.toHiragana(pattern).match(searchWord) ||
	        string.toKatakana(pattern).match(searchWord);
	};
	/**
	 * Created by okunishitaka on 11/5/13.
	 */

	tek.date = {};

	/**
	 * convert date to utc
	 * @param date
	 */
	tek.date.toUTC = function (date) {
	    return Date.UTC(
	        date.getFullYear(),
	        date.getMonth(),
	        date.getDate(),
	        date.getHours(),
	        date.getMinutes(),
	        date.getSeconds(),
	        date.getMilliseconds());
	};
	var detectBrowser = tek.detectBrowser = function (window) {
	    var navigator = window.navigator;
	    if (detectBrowser.isIE(navigator)) {
	        return {
	            browser: 'IE',
	            version: detectBrowser.getIEVersion(navigator)
	        }
	    }
	    if (detectBrowser.isChrome(window)) {
	        return {
	            browser: 'chrome',
	            version: null //TODO
	        }
	    }
	    if (detectBrowser.isFirefox(window)) {
	        return {
	            browser: 'firefox',
	            version: null //TODO
	        }
	    }
	    return null;
	};
	detectBrowser.isChrome = function (window) {
	    return !!(window && window.chrome);
	};

	detectBrowser.isFirefox = function (navigator) {
	    var ua = navigator && navigator.userAgent;
	    return !!(ua && ua.toLowerCase().indexOf('firefox') > -1);
	};

	detectBrowser.isIE = function (navigator) {
	    return navigator && navigator.appName == 'Microsoft Internet Explorer';
	};
	detectBrowser.getIEVersion = function (navigator) {
	    var ua = navigator && navigator.userAgent;
	    if (!ua) return null;
	    var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
	    return re.exec(ua) ? parseFloat(RegExp.$1) : -1;
	};
	/**
	 * do nothing
	 */
	tek.doNothing = function () {

	};
	var define = tek.define;
	/**
	 * Validator
	 * @constructor
	 */
	var Validator = define({
	    init: function (expected) {
	        var s = this;
	        s.expected = expected;
	    },
	    properties: {
	        skipIfEmpty: false,
	        validate: function (value, callback) {
	            callback();
	        }
	    }
	});

	/**
	 * Err
	 * @constructor
	 */
	Validator.Err = define({
	    init: function (data) {
	        var s = this;
	        tek.copy(data, s);
	    }
	});

	/**
	 * define new Validator
	 * @param properties
	 * @returns Validator
	 */
	Validator.defineValidator = function (properties) {
	    var Defined = define({
	        prototype: Validator,
	        properties: properties
	    });
	    tek.copy(Validator, Defined);
	    return  Defined;
	};

	/**
	 * is value empty or not
	 * @param value
	 * @returns {boolean}
	 */
	Validator.isEmpty = function (value) {
	    return (value === null) || (value === undefined) || (value === '');
	};

	var v = tek.validators = {};
	v.Validator = Validator;

	var Err = Validator.Err,
	    defineValidator = Validator.defineValidator;

	/**
	 * RequiredValidator
	 * @constructor
	 */
	v.RequiredValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this;
	        var actual = Validator.isEmpty(value),
	            expected = false;
	        var valid = actual === expected,
	            err = valid ? null : new Err({
	                cause: 'required',
	                expected: expected,
	                actual: actual
	            });
	        callback(err);
	    },
	    skipIfEmpty: false
	});

	/**
	 * MinLengthValidator
	 * @constructor
	 */
	v.MinLengthValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            actual = value.length,
	            expected = s.expected;
	        var valid = expected <= actual,
	            err = valid ? null : new Err({
	                cause: 'too_short',
	                expected: expected,
	                actual: actual
	            });
	        callback(err);
	    },
	    skipIfEmpty: true
	});

	/**
	 * MaxLengthValidator
	 * @constructor
	 */
	v.MaxLengthValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            actual = value.length,
	            expected = s.expected;
	        var valid = actual <= expected,
	            err = valid ? null : new Err({
	                cause: 'too_long',
	                expected: expected,
	                actual: actual
	            });
	        callback(err);
	    },
	    skipIfEmpty: true
	});

	/**
	 * PatternValidator
	 * @constructor
	 */
	v.PatternValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            actual = String(value),
	            expected = s.expected;
	        var valid = !!actual.match(s.expected),
	            err = valid ? null : new Err({
	                cause: 'not_match',
	                expected: expected,
	                actual: actual
	            });
	        callback(err);
	    },
	    skipIfEmpty: true
	});

	/**
	 * MinimumValidator
	 * @constructor
	 */
	v.MinimumValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            actual = Number(value),
	            expected = s.expected;
	        var valid = expected <= actual,
	            err = valid ? null : new Err({
	                cause: 'too_small',
	                expected: expected,
	                actual: actual
	            });
	        callback(err);
	    },
	    skipIfEmpty: true
	});

	/**
	 * MaximumValidator
	 * @constructor
	 */
	v.MaximumValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            actual = Number(value),
	            expected = s.expected;
	        var valid = actual <= expected,
	            err = valid ? null : new Err({
	                cause: 'too_large',
	                expected: expected,
	                actual: actual
	            });
	        callback(err);
	    },
	    skipIfEmpty: true
	});

	/**
	 * TypeValidator
	 * @constructor
	 */
	v.TypeValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            actual = typeof(value),
	            expected = s.expected;
	        var valid = typeof(value) === s.expected,
	            err = valid ? null : new Err({
	                cause: 'different_type',
	                expected: expected,
	                actual: actual
	            });
	        callback(err)
	    },
	    skipIfEmpty: true
	});

	v.FormatValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this,
	            expected = s.expected,
	            actual = String(value),
	            valid = true;
	        switch (expected) {
	            case 'email':
	                valid = !!actual.match(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
	                break;
	        }
	        var err = valid ? null : new Err({
	            cause: 'mulformat',
	            expected: expected,
	            actual: actual
	        });
	        callback(err);
	    },
	    skipIfEmpty: true
	});

	/**
	 * ConformValidator
	 * @constructor
	 */
	v.ConformValidator = defineValidator({
	    validate: function (value, callback) {
	        var s = this;
	        s.expected(value, callback);
	    }
	});

})(typeof(module) === 'undefined' ? this['tek'] = {} : module.exports);


Official figures released by the Government today show that stamp duty cuts have helped thousands of first-time buyers in England to save millions.
In November 2017, the Chancellor introduced first-time buyer stamp duty relief in an effort to help more young people onto the housing ladder - with homes worth less than £300,000 exempt from the tax.
Now, according to HM Revenue & Customs' quarterly stamp duty land tax statistics, 121,500 first-time buyers have saved a total of £284,000,000 since the Government's cut to stamp duty, which analysis by Savills says equates to around £2,385 per buyer.
However, the reduction has been criticised by some for having a minimal impact on housing sales, and last week, the Treasury Select Committee called for the abolition of the Lifetime ISA, introduced to help first-time buyers and pension savers, citing a lack of popularity.
In September 2017, NAEA Propertymark called for the Government to exempt first-time buyers from paying stamp duty, in order to encourage more people into home ownership, following month on month falls in sales to first-time buyers.
The report, which is part of a much wider long-term commitment to make housing more affordable, has forecast that over the next five years the policy will help over one million people to get onto the housing ladder.
As part of the Autumn Budget housing package, the Chancellor announced at least £44 billion for housing - which includes at least £15.3 billion of financial support for house building over the next five years – and an aim to build 300,000 new homes a year in the areas that need it, as well as encouraging better use of land in cities and towns.


HOME MODELS NEWS STORE TOUR LINKS CONTACT CASTING WEBMASTERS MEMBERS JOIN NOW!
9 All New HD Video Clips Added!
9 ALL-NEW HD Video Clips Added!
Welcome to MuscleGallery.com, the center of Bodybuilding Entertainment!
Muscle Gallery has been a constant enrichment for the fans of bodybuilders and male muscle models worldwide. Unlike others, MG.com travels the world to find you the most exceptional buff and musclar men, currently representing 40 different nations. Many World Champions, IFBB Pro Bodybuilders and magazine cover models are first seen spectacular location shots throughout the world. MuscleGallery.com doesn't sign just any athlete; only the best are good enough. MG's members can enjoy an enormous library of original and unique video clips in all formats and spectacular picture galleries.


MeoCare launches turn-key wellness challenges to help promote health and wellness for smaller employers.
Corporate wellness programs focus on large corporations, but more than 99% of the firms in the United States have fewer than 500 employees.
Most large employers have some type of employee wellness program. Whereas only 22% of small employers currently offer such programs, according to the National Small Business Association. Their first product "Bite Into Health " gives these smaller employers a simple, affordable way to promote health within their organizations.
The "Bite Into Health" wellness challenge enables employers to bring wellness into their business in a dynamic and affordable way. The wellness challenge combines; a highly engaging offline promotions pack with a technology driven health platform. This dual online and offline approach engages more employees and drives real engagement and outcomes. "We're really excited to work with smaller organizations. It's time for a straightforward, affordable way to promote health." says CEO James Malone.
As the corporate wellness industry booms small businesses have been left under served. MeoCare is opening up this untapped market to be able to provide small businesses with access to a comprehensive wellness solution they can afford.
Six week branded wellness challenge available on mobile, tablet or desktop.
MeoCare platform access for 6 months + FREE additional health programs for employees.
Comprehensive administrator's roll out guide.
10 large branded and tailored posters.
Accompanying branded health booklet for all employees.
MeoCare works with leading organizations, to help value, appreciate, reward and recognize their employees. Effectively recognizing and rewarding employees for health achievements inside and outside of work drives positive sentiment, cultural alignment and organizational engagement. Corporate Yoga, weight loss, Pilates, stress management, cooking and fitness are some of the health programs delivered through the MeoCare SaaS enterprise health platform. The MeoCare platform takes the next step in personal health by providing programs suited to each individual. MeoCare is headquartered in Ireland with offices in Kilkenny and Indiana.


text:
The greening of the red zone
Good keen birds
Sandflies
The Fishes of New Zealand
Fallen from grace
The biggest bird brain
The price of fish
In a corner of a foreign field
Beyond the Bermuda Triangle: The Devil's Sea
A hitchhiker's guide to the Pacific Ocean
The Field Guide to the Birds of New Zealand
Written by Dennis Gordon & Warren Judd
Listers Tickers or twitchers" ornithologistspeak for those who have master lists of all the bird species in the world, and delight in marking off each species they have spotted will find this book a joy.
The first third of the book provides 74 colour plates and facing-page descriptions of every species of living bird recorded from New Zealand.
There is even a page for five species exterminated since 1900, just in case you should happen upon a huia or piopio at the bird bath.
Although small, the illustrations are lucid, with most species depicted in all their guises non-breeding, immature, male, female, even in flight. Accompanying descriptions give physical details, a distribution map, habitat and calls for each species.
But there is much more. The bulk of the book is occupied by detail about the biology, behaviour, distribution, ecology and conservation status of the 328 species that have been found here, and a list of key references is given for each.
Expect to find all that is significant, but no wasted words. The volume has a pleasing heft to it, but is not too bulky to be squeezed into the corner of a rucksack.
The book is a descendant of the original field guide to the birds of New Zealand, produced by Falla, Sibson and Turbott in 1966, but is a completely new work.
Like the original field guide, this volume has close links to the Ornithological Society of New Zealand, and the authors are donating their profits to the society to support bird research.
More by Dennis Gordon & Warren Judd

redpajama_set_name: RedPajamaCommonCrawl


text:
Turkey: The Missing Children
published 6 years ago by DW.COM | Deutsche Welle
More than 14,000 children have disappeared in Turkey in the last five years alone. A special police unit has been formed to look for those still missing. The General Command of the Turkish Gendarmerie says human trafficking is involved in most cases, and that children are being kidnapped as laborers, child soldiers and even for the illegal organ trade. Although most have since been found, 834 children who disappeared within the last five years remain missing. Currently the police are looking for almost 1500 children.
belongs to Focus on Europe | Deutsche Welle
filed in Society & Culture
more episodes from Focus on Europe | Deutsche Welle
Russia: Fighting mountains of garbage
Italy: From "Mafia Village" to model community
Bosnia: Lipa's refugees
Portugal: Beloved spot for digital nomads
EU medical workers flee Britain due to Brexit
The Babushka from Lake Baikal


Falling feijoas and I notice autumn has arrived. The Hurricanes scrum starts looking impressive and I know Asafo Aumua has arrived.
Yes, he is light on big-game experience, but if Aumua isn't tucking into an in-flight Teppanyaki Bento box en route to Japan for a particular rugby tournament later this year then I'm chucking in the Rugby analysis for needlecraft. Is there any other player in Super Rugby with potential as scary as his? To give an over-used word I generally detest, 'explosive'.
As for the dark arts of front-row play, I'm as much if not more in the pitch dark about all the goings-on in there as you might be, but at any rate I'll now try to advocate for Aumua's potential inclusion in our 2019 World Cup squad.
and that trying to halt him one-on-one near the tryline is about as difficult as getting Shane Jones to utter a normal-sounding sentence that doesn't contain verbosity or pomposity. What is fast becoming increasingly noticeable in recent games though, is Aumua's strength and imposition at scrum time.
One thing that stood out in the Hurricanes-Crusaders match last week was the sudden go forward of the Canes' scrum when Aumua came on. The advantage to watching this unfold being that several scrums did take place in close proximity to my seat. For the several scrums that then followed it was like watching a tractor ploughing a field which suddenly found an extra gear- the only problem being this advantage was constantly voided by the Hurricanes attack being afflicted with the 'dropsies'. Although the uncompromising defence of the Crusaders was a stand out here also.
Against the Highlanders on Friday, same result. The scrum steadied with Aumua's introduction, and a good point was made to me by an observant pundit- it was from this kind of solid platform that the second-half try to Laumape was created, from Beauden Barrett running off front foot ball, stepping and splitting the Highlanders' inside channel before an SBW-esque offload to Laumape, who did the rest with some style. And then in the final stanzas, with the Otago side hammering away on attack and more or less camped within the twenty-two metre area, the Hurricanes eight shoved the opponents clean off the ball- a very unusual feat for them this season.
Any arguments that Aumua would ever usurp a fit Dane Coles this year would be absurd, but how fortunate the Canes are to have such a weapon to bring on. Not forgetting they also have Ricky Riccitelli, a very good player in his own right. Their hooking stocks are bursting.
Imagine the potential chaos Aumua could wreak against one of the smaller nations at the Rugby World Cup. That would almost be unfair. Or how he could rise to the call if summoned from the pine against the Tier One sides should anything strike down Coles or Codie Taylor. Does he have the all-round game, or is it too early?
If he happened to make the early All Black squads this season, was treated fairly and built up a trusting relationship with the coaches, with them importantly having his back (because, for whatever reason- and this will sound controversial-the ABs heirachy have a bit of an unfortunate recent history of appearing to be less patient with, and then casting aside of a few of the players of PI origin), there's no reason Aumua couldn't be chosen for the squad to Japan and be a stand-out at the Cup, even with limited game time.
I have enough doubt that he won't make the final cut for various reasons, but it would be neglectful not to give him very serious consideration, especially if he gets more minutes and continues on an upward path in Super Rugby this season.
To be crystal clear re. the last paragraph: '…won't make the final cut for various reasons'. This definitely does NOT include any reasons being ethnicity-related.
Am not suggesting for a nanosecond that Aumua would ever miss out on going to the World Cup because of that factor…just to put the record absolutely straight.


For the best part of your day!
Teams compete Tuesday nights for 7 weeks - 13 March-24 April 2018.
Matches count for individual grading points and teams earn points to be the series winner in respective divisions.
Sorry, no items have been added to this area yet.
With a maximum capacity of 100 people its the perfect venue for the likes of a 21st birthday party, engagement party, even a wedding reception - through to a small work meeting, training seminar or conference.
Gym members coming outside of office hours will need to bring membership cards to activate front door and personal codes to open gym door.


Together we can help The Church become the walking, talking and glorfying example of God's Excellent Health. Will you help make that possible?
Although the topic is FOOD the message is SALVATION.
"Such a blessing - I have never realized the spiritual problems I was dealing with were related to my undisciplined eating."
"Now I know that stuffing my mouth with food was a substitute for turning to God in time of need.
"I am a new person - Thank You."
"I am wearing a size 8 - never thought possible. Thank You."
"I loved your offering plate story, now when I plan my meals it is more about what will benefit my body - therefore my testimony, I mean my Tastimony - is a reflection of that offering."
"I was that woman at the well - a food adulterous. Now I am set free."
Each year God brings new flavors into the Flavor of Grace ministry. The year 2019 is no different. The Church is still spiraling out of control with health challenges. The Flavor of Grace team is equipped to meet this need and through the power of God's WORD - share Christ in the homes of believers so that they can then multiply the message and share with their neighbors and friends.
We need your help to train the churches on how to open their homes, their kitchens and invite hurting and sick people in to hear the message of God's love while enjoying a fun time in the kitchen.
SBF is a program being launched this year to invite churches to learn how to share the Gospel with the use of cooking events in the home. Flavor of Grace has written Bible Studies that go along with stories in the Bible. These stories all relate to food. Ladies invite their friends into the home and events start with having fun cooking together. The cooking classes include health benefits of the recipes, how to shop for the best ingredients, plus more. Then while the women sit to enjoy the foods they just prepared, a story is shared of how this food was used in Scripture to teach key principles such as Grace, Love, Acceptance, discipline, etc.
Flavor of Grace needs your support to expand this ministry to churches across the country. We need your help with the printing of these studies, the training of churches and letting churches know it exists.
Flavor of Grace is leading a trip to Israel in September. This trip will include visiting the Red Sea, seeing an exact replica of the Tabernacle, walking the streets of Jerusalem, plus so much more. We need your support because this trip includes missions to the troops, helping with the "Pro-Life" movement, and supporting missionaries on the ground in Israel.
The role of the Shepherd can be lonely and difficult. The Flavor of Grace team is here to help our key leaders get back in shape with their health and their Spiritual journey. Without our key leaders in physical shape ministries cease.
Our front line needs encouragment, support and teaching of how to care for their bodies and yet not feel exposed to their congregation. Our team works privately with each leader to help them become physically God's best so their Ministry/Mission can be strong. Many of these leaders do not have the funds to pay for the services such as blood work, lab interpretation, supplements, and counseling. We need your support to keep this key ministry available to those in need. Help us keep the Front Line - on the Front Line!
Flavor of Grace took the message of salvation through the tool of cooking classes, nutrition seminars, LIFE coaching and Bible studies to the FIELDS of the Pine Ridge Indian Reservation, the STATES of South Dakota, Missouri, Virginia, Tennessee, Colorado, New York, Florida and Maryland, and the COUNTRIES of Africa, Paupau New Guinea and Canada.
Flavor of Grace continued to serve churches and individuals with the message of God's love through the invitation of food.
The Flavor of Grace team continued to help churches develop wellness ministries that reach into the community with the flavor of good food and the message of God's love and grace.
Our team joined Bellevue Baptist in Memphis, TN on a mission to the Pine Ridge Reservation Indians. Annette lead cooking classes and nutrition seminars to the women of that village. The invitation was food ~ the message was God's love and salvation.
Pastors in Missouri, Tennessee, Texas, Virginia and Maryland have been counseled with a health program that recharged their health and equipped them to stay in the ministry - To God be the Glory! Do you have a pastor that needs sound biblical nutrition coaching to stay in the ministry and weather the storms of illness?
Flood victims in Texas have benefited with money and kitchen supplies.
Over 15,000 people this year have benefited from our free resources, prayer team, and personal coaching to overcome the shackles of cultural sickness to now experience the freedom of biblical eating. Who do you know that needs sound biblical nutrition help?
RADIO - our first year on the radio was a tremendous success. God allowed us to be on stations in Virginia, Missouri, and Indiana. This expanded our reach with the Gospel of the dinner table to over 3 million listeners.
CONFERENCES - Spreading the Gospel to men and women while sharing God's recipe for excellent health. In 2016 our conferences and seminars were presented in the US plus Jerusalem! Yes, we went international!
ISREAL - Because of our faithful givers, we were able to lead a mission team to plant a Biblical Foods Prayer Garden in the heart of Jerusalem. This was such a blessing to see our prayers meet with the prayers of the local missionaries. This garden will be visited by all faiths and unbelievers. Every who enters will hear the Gospel as the story of God's provision is shared. While in Jerusalem Annette lead a Nutrition Seminar.
LOUISIANA FLOOD RELIEF - we partnered with a local ministry and sent a pallet of products to help 50 pastors restore their homes and clean up from the massive flooding this past summer.
CONSULTATIONS - Pastors and ministry wives are given free consultations as they desire to see their body reflect the goodness God designed. Many are tired, sick and needing physical and spiritual support. Flavor of Grace is here to be that support. Your gifts allow us the funds to supply them with resources and support with our recommended physicians.
Moving into 2017 - God has not called us to quit! Instead, He has called us to move forward. This call needs your help and support.
Pray and let us know If you are a business owner and would like to be a sponsor of this life-changing radio program, podcast or conferences.
And at such a time as these people are struggling and their health has become a roadblock.
Flavor of Grace Podcast and One Day Conferences bring an energetic bite of nutrition marinated in God's Word for a fresh taste His Goodness.
This bite of Truth will strengthen our listener's walk with the Lord both spiritually and physically.
This past year has given us opportunities to be on the air and as soon as the message was heard our phones and emails were filled with questions about health. And as we talked with each person we quickly realized there was a heart problem as well.
That is why this message is so important. Food struggles mask heart struggles.
Respond with the Gospel to those who connect with our office for consultations and needs.
Please consider giving today – the radio stations are waiting for our response and we here at FOG are waiting for your response.
Listen to see how your gift will be used to reach out to millions.
ONLINE:– Many people find this secure method the easiest way to donate. Give a one-time gift or become a monthly partner.
Click here for a form to accompany your check.


Kawela Kealoha and Analia Schaefer peer from behind the bleacher fencing at Hanapepe Stadium during the 57th Kauai Pop Warner Football League jamboree to open the youth football season.
Taiko Kauai performs to open the Friendship House 30th anniversary celebration Friday in Kapaa.
Award-winning Laurie Williams performs a blues number, getting backup from Suzette Racca, during the Friendship House 30th anniversary celebration Friday in Kapaa.
Laura Miyashiro, Warren Dastrup, Laurie Williams and Suzette Racca make up the Friendlies, who perform during the Friendship House 30th anniversary celebration Friday in Kapaa.
Congratulations to Terry- Ann Moses, Dave Jordan (didn't anyone tell you you can't retire?), Jack Yatsko and all of the members of Friendship House, and community volunteers (Mel Rapozo — Derek Kawakami was doing his thing with Jeff Sacchini and the Kauai Marathon and missed the football game because he had trash duty) on a great 30th anniversary celebration!
Kudos to the Friendlies (they're still around!) and Troy Waialeale (he showed up just in time to help with the tech issues on the sound system), and Debby Thompson got her Kauai Lions Club people to help with the volunteers, although the hard work (in the rain) of trying to manage parking went to the Friendship House members, and it was nice to run into all those Taiko Kauai performers who got to sample some of the food truck goodies.
Kudos, too, to Coach Teddy Arroyo (can't believe how many officials and Arthur Brun were able to get up early after Friday night's football game) on a great jamboree to welcome the Kauai Pop Warner Football League's 57th season … even Coach Beau Acoba got to do microphone duty instead of having to coach Tsunami Taiko drummers, and the Rev. Wesley Elmore (he's really making the most of his trip here) made it to Hanapepe Stadium … does this mean Val Kaneshiro is going to the 40th Labor Day Breakfast at the Lihue United Church (better hurry, it's only from 7 to 10 a.m.)?


The team made their official announcement Monday night and are planning on trying to qualify for their first start in the Daytona 500.
"Tanner is a very intelligent and motivated young man, and I am very excited to what he can accomplish during his rookie season," said team owner, Victor Obaika.
Berryhill made his Cup Series debut in 2018 with Obaika Racing, competing in the final two races of the season at ISM Raceway and Homestead-Miami Speedway. He has made 40 starts in the NASCAR Xfinity Series in previous years.
"I am very thankful for the opportunities that Victor Obaika, the whole race team, and our partners are giving me, and I'm looking forward to making the most of it" said Berryhill.
Obaika Racing has made 78 starts in the Xfinity Series between 2015-2017 with Peyton Sellers making the most starts among the team's list of 18 different drivers.
David Starr made the only other start for the team in the Cup Series at Texas Motor Speedway earlier this year.


It's Epic. It's Here. Finally.
It's Epic. It's Here. Finally.
If you're in the sign industry, and spending any time on the webby-web, you might have seen some of our teasers about a new "4"-like machine. Well, it's finally here. The original "Pro" line started in 2002, and has been a part of our flagship of printer/cutters ever since. 10-years later, we're on the 4th edition. It seems like it's been a lot longer, and in most technology-circles, that's a lifetime.
Welcome Roland SOLJET Pro 4!
It's worth noting that the new XR comes with an industry-first 2-year trouble-free warranty – much like the "BMW Ultimate Service" program where parts & labor are included, along with 2 scheduled preventitive maintanence visits are also part of the program. I don't know of another printer company doing this. Boom.
Tyrell Tech's post. Gotta love it.
And tracking the mentions on twitter using Twilert has us at 70 mentions until the 2pm notice. I'll be checking all week to see how it perpetuates throughout the web.
I particularly like this one: RT @SignGeeks: Sod the iPhone 5 launch – Roland have a new printer out today!!! The Soljet Pro 4!
This is fun. I love it when we launch new products.