You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by kx...@apache.org on 2015/07/29 00:42:27 UTC

[02/54] jiffy commit: updated refs/heads/master to ef77de4

http://git-wip-us.apache.org/repos/asf/couchdb-jiffy/blob/11ab9738/test/jiffy_09_reg_issue_24_tests.erl
----------------------------------------------------------------------
diff --git a/test/jiffy_09_reg_issue_24_tests.erl b/test/jiffy_09_reg_issue_24_tests.erl
new file mode 100644
index 0000000..ca72d1b
--- /dev/null
+++ b/test/jiffy_09_reg_issue_24_tests.erl
@@ -0,0 +1,3462 @@
+% This file is part of Jiffy released under the MIT license.
+% See the LICENSE file for more information.
+
+-module(jiffy_09_reg_issue_24_tests).
+
+
+-include_lib("proper/include/proper.hrl").
+-include_lib("eunit/include/eunit.hrl").
+-include("jiffy_util.hrl").
+
+
+no_segfault_test_() ->
+    {"no segfault", [
+        ?_assert(begin jiffy:encode(big_doc(), [uescape]), true end)
+    ]}.
+
+
+big_doc() ->
+    {[{<<"_id">>,<<"_design/bookmarks">>},
+      {<<"_rev">>,<<"1-1794a8236590d2fc6c288115dc539a3d">>},
+      {<<"lib">>,
+       {[{<<"app">>,
+          <<"\nmodule.exports = {\n\n    views: require('./views'),\n    shows : require('./shows'),\n    rewrites: require('./rewrites'),\n    updates: require('./updates')\n};\n\n// Bind event handlers\n// require('./events')\n">>},
+         {<<"rewrites">>,
+          <<"/**\n * Rewrite settings to be exported from the design doc\n */\n\nmodule.exports = [\n    {from: '/static/*', to: 'static/*'},\n    {from: '/bootstrap/*', to: 'bootstrap/*'},\n    {from: '/modules.js', to: 'modules.js' },\n    {\"from\": \"/_db/*\", \"to\": \"../../*\" },\n    {\"from\": \"/_db\", \"to\": \"../..\" },\n    {\"from\": \"/bookmark_lite\", \"to\" : \"_show/bookmark_lite\"},\n    {\"from\": \"/bookmark\", \"to\" : \"_show/bookmark\"},\n    {\"from\": \"/save\", \"to\" : \"_update/bookmark\"},\n    {\"from\": \"/click/*\", \"to\" : \"_update/click/*\"},\n    {\"from\": \"/archive/*\", \"to\" : \"_update/archive/*\"},\n    {from: '/', to: 'index.html'}\n];">>},
+         {<<"shows">>,
+          <<"var templates = require('handlebars').templates;\n\nexports.bookmark_lite = function(doc, req) {\n\n    return {\n        code: 200,\n        headers: {'content-type' : 'text/html'},\n        body: templates['newBookmark.html']({\n            title : req.query.title,\n            url  : req.query.url\n        })\n    };\n\n}\n\nexports.bookmark = function(doc, req) {\n    return {\n        code: 200,\n        headers: {'content-type' : 'text/html'},\n        body: '<h2>Hellp</h2>'\n    };\n}\n\n">>},
+         {<<"updates">>,
+          <<"\nvar md5 = require('md5');\nvar querystring = require('querystring');\n\nexports.bookmark = function(doc, req) {\n\n    var details = {};\n    if (req.body && req.body.length > 0) {\n        details = querystring.parse(req.body);\n    }\n    if (req.query.title) details.title = req.query.title;\n    if (req.query.url)   details.url = req.query.url;\n\n    if (!doc) {\n        var id = md5.hex(details.url);\n        var doc = {\n            _id : id,\n            type: 'com.eckoit.bookmark',\n            title : decodeURIComponent(details.title),\n            url : decodeURIComponent(details.url),\n            timestamp: new Date().getTime()\n        };\n        if (details.short_text) doc.short_text = details.short_text;\n        log(doc);\n        return [doc, 'SUCCESS']\n\n    } else {\n\n    }\n}\n\nexports.click = function(doc, req) {\n    if (!doc.clicks) doc.clicks = 0;\n    doc.clicks++;\n    return [doc, 'SUCCESS'];\n}\n\nexports.archive = function(doc, req) {\
 n    doc.archive = true;\n    return [doc, 'SUCCESS'];\n}">>},
+         {<<"views">>,
+          <<"\n\nexports.by_date = {\n    map : function(doc) {\n\n        if (doc.archive) return;\n\n        if (doc.type && doc.type === 'com.eckoit.bookmark' ) {\n            var timestamp = doc.timestamp;\n            if (!timestamp) timestamp = new Date(0);\n            emit(timestamp, null);\n        }\n    }\n}\n\nexports.by_views = {\n    map : function(doc) {\n\n        if (doc.archive) return;\n\n        if (doc.type && doc.type === 'com.eckoit.bookmark' ) {\n            var clicks = doc.clicks;\n            if (!clicks) clicks = 0;\n\n            var timestamp = doc.timestamp;\n            if (!timestamp) timestamp = new Date(0);\n\n            emit([clicks, timestamp], null);\n        }\n    }\n}\n\nexports.all_tags = {\n    map : function(doc) {\n        if (doc.type && doc.type == 'garden.tag') {\n            emit(doc.hash, null);\n        }\n    }\n}\n">>}]}},
+      {<<"underscore">>,
+       <<"//     Underscore.js 1.3.1\n//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.\n//     Underscore is freely distributable under the MIT license.\n//     Portions of Underscore are inspired or borrowed from Prototype,\n//     Oliver Steele's Functional, and John Resig's Micro-Templating.\n//     For all details and documentation:\n//     http://documentcloud.github.com/underscore\n\n(function() {\n\n  // Baseline setup\n  // --------------\n\n  // Establish the root object, `window` in the browser, or `global` on the server.\n  var root = this;\n\n  // Save the previous value of the `_` variable.\n  var previousUnderscore = root._;\n\n  // Establish the object that gets returned to break out of a loop iteration.\n  var breaker = {};\n\n  // Save bytes in the minified (but not gzipped) version:\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n\n  // Create quick reference variables for speed access to core prototypes.\n
   var slice            = ArrayProto.slice,\n      unshift          = ArrayProto.unshift,\n      toString         = ObjProto.toString,\n      hasOwnProperty   = ObjProto.hasOwnProperty;\n\n  // All **ECMAScript 5** native function implementations that we hope to use\n  // are declared here.\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n\n  // Create a safe reference to the Underscore object for use below.\n  var _ = function(obj) { return new wrapper(obj); };\n\n  // Export the Underscore object fo
 r **Node.js**, with\n  // backwards-compatibility for the old `require()` API. If we're in\n  // the browser, add `_` as a global object via a string identifier,\n  // for Closure Compiler \"advanced\" mode.\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root['_'] = _;\n  }\n\n  // Current version.\n  _.VERSION = '1.3.1';\n\n  // Collection Functions\n  // --------------------\n\n  // The cornerstone, an `each` implementation, aka `forEach`.\n  // Handles objects with the built-in `forEach`, arrays, and raw objects.\n  // Delegates to **ECMAScript 5**'s native `forEach` if available.\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, l = 
 obj.length; i < l; i++) {\n        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      for (var key in obj) {\n        if (_.has(obj, key)) {\n          if (iterator.call(context, obj[key], key, obj) === breaker) return;\n        }\n      }\n    }\n  };\n\n  // Return the results of applying the iterator to each element.\n  // Delegates to **ECMAScript 5**'s native `map` if available.\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results[results.length] = iterator.call(context, value, index, list);\n    });\n    if (obj.length === +obj.length) results.length = obj.length;\n    return results;\n  };\n\n  // **Reduce** builds up a single result from a list of values, aka `inject`,\n  // or `foldl`. Delegates to **ECMAScript 5**'s
  native `reduce` if available.\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError('Reduce of empty array with no initial value');\n    return memo;\n  };\n\n  // The right-associative version of reduce, also known as `foldr`.\n  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    
 if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var reversed = _.toArray(obj).reverse();\n    if (context && !initial) iterator = _.bind(iterator, context);\n    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);\n  };\n\n  // Return the first value which passes a truth test. Aliased as `detect`.\n  _.find = _.detect = function(obj, iterator, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n\n  // Return all the elements that pass a truth test.\n  // Delegates to **ECMAScript 5**'s native `filter` if available.\n  // Aliased as `select`.\n  _.filter = _.select = function(obj, iterator, context) {\n    
 var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);\n    each(obj, function(value, index, list) {\n      if (iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Return all the elements for which a truth test fails.\n  _.reject = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    each(obj, function(value, index, list) {\n      if (!iterator.call(context, value, index, list)) results[results.length] = value;\n    });\n    return results;\n  };\n\n  // Determine whether all of the elements match a truth test.\n  // Delegates to **ECMAScript 5**'s native `every` if available.\n  // Aliased as `all`.\n  _.every = _.all = function(obj, iterator, context) {\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.
 every(iterator, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && iterator.call(context, value, index, list))) return breaker;\n    });\n    return result;\n  };\n\n  // Determine if at least one element in the object matches a truth test.\n  // Delegates to **ECMAScript 5**'s native `some` if available.\n  // Aliased as `any`.\n  var any = _.some = _.any = function(obj, iterator, context) {\n    iterator || (iterator = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = iterator.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n\n  // Determine if a given value is included in the array or object using `===`.\n  // Aliased as `contains`.\n  _.include = _.contains = function(obj, target) {\n    var found = false;\n    if (obj 
 == null) return found;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    found = any(obj, function(value) {\n      return value === target;\n    });\n    return found;\n  };\n\n  // Invoke a method (with arguments) on every item in a collection.\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    return _.map(obj, function(value) {\n      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);\n    });\n  };\n\n  // Convenience version of a common use case of `map`: fetching a property.\n  _.pluck = function(obj, key) {\n    return _.map(obj, function(value){ return value[key]; });\n  };\n\n  // Return the maximum element or (element-based computation).\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);\n    if (!iterator && _.isEmpty(obj)) return -Infinity;\n    var result = {computed : -Infinity};\n    each(ob
 j, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed >= result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Return the minimum element (or element-based computation).\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);\n    if (!iterator && _.isEmpty(obj)) return Infinity;\n    var result = {computed : Infinity};\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      computed < result.computed && (result = {value : value, computed : computed});\n    });\n    return result.value;\n  };\n\n  // Shuffle an array.\n  _.shuffle = function(obj) {\n    var shuffled = [], rand;\n    each(obj, function(value, index, list) {\n      if (index == 0) {\n        shuffled[0] = value;\n      } else {\n      
   rand = Math.floor(Math.random() * (index + 1));\n        shuffled[index] = shuffled[rand];\n        shuffled[rand] = value;\n      }\n    });\n    return shuffled;\n  };\n\n  // Sort the object's values by a criterion produced by an iterator.\n  _.sortBy = function(obj, iterator, context) {\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value : value,\n        criteria : iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria, b = right.criteria;\n      return a < b ? -1 : a > b ? 1 : 0;\n    }), 'value');\n  };\n\n  // Groups the object's values by a criterion. Pass either a string attribute\n  // to group by, or a function that returns the criterion.\n  _.groupBy = function(obj, val) {\n    var result = {};\n    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };\n    each(obj, function(value, index) {\n      var key = iterator(value, index);\n      (re
 sult[key] || (result[key] = [])).push(value);\n    });\n    return result;\n  };\n\n  // Use a comparator function to figure out at what index an object should\n  // be inserted so as to maintain order. Uses binary search.\n  _.sortedIndex = function(array, obj, iterator) {\n    iterator || (iterator = _.identity);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >> 1;\n      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n\n  // Safely convert anything iterable into a real, live array.\n  _.toArray = function(iterable) {\n    if (!iterable)                return [];\n    if (iterable.toArray)         return iterable.toArray();\n    if (_.isArray(iterable))      return slice.call(iterable);\n    if (_.isArguments(iterable))  return slice.call(iterable);\n    return _.values(iterable);\n  };\n\n  // Return the number of elements in an object.\n  _.size = function(obj) {\n    return _.toArr
 ay(obj).length;\n  };\n\n  // Array Functions\n  // ---------------\n\n  // Get the first element of an array. Passing **n** will return the first N\n  // values in the array. Aliased as `head`. The **guard** check allows it to work\n  // with `_.map`.\n  _.first = _.head = function(array, n, guard) {\n    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];\n  };\n\n  // Returns everything but the last entry of the array. Especcialy useful on\n  // the arguments object. Passing **n** will return all the values in\n  // the array, excluding the last N. The **guard** check allows it to work with\n  // `_.map`.\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n\n  // Get the last element of an array. Passing **n** will return the last N\n  // values in the array. The **guard** check allows it to work with `_.map`.\n  _.last = function(array, n, guard) {\n    if ((n != null) && !guard) {\n   
    return slice.call(array, Math.max(array.length - n, 0));\n    } else {\n      return array[array.length - 1];\n    }\n  };\n\n  // Returns everything but the first entry of the array. Aliased as `tail`.\n  // Especially useful on the arguments object. Passing an **index** will return\n  // the rest of the values in the array from that index onward. The **guard**\n  // check allows it to work with `_.map`.\n  _.rest = _.tail = function(array, index, guard) {\n    return slice.call(array, (index == null) || guard ? 1 : index);\n  };\n\n  // Trim out all falsy values from an array.\n  _.compact = function(array) {\n    return _.filter(array, function(value){ return !!value; });\n  };\n\n  // Return a completely flattened version of an array.\n  _.flatten = function(array, shallow) {\n    return _.reduce(array, function(memo, value) {\n      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));\n      memo[memo.length] = value;\n      return memo;\n    }, []);
 \n  };\n\n  // Return a version of the array that does not contain the specified value(s).\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n\n  // Produce a duplicate-free version of the array. If the array has already\n  // been sorted, you have the option of using a faster algorithm.\n  // Aliased as `unique`.\n  _.uniq = _.unique = function(array, isSorted, iterator) {\n    var initial = iterator ? _.map(array, iterator) : array;\n    var result = [];\n    _.reduce(initial, function(memo, el, i) {\n      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {\n        memo[memo.length] = el;\n        result[result.length] = array[i];\n      }\n      return memo;\n    }, []);\n    return result;\n  };\n\n  // Produce an array that contains the union: each distinct element from all of\n  // the passed-in arrays.\n  _.union = function() {\n    return _.uniq(_.flatten(arguments, true));\n  };\n\n  // Produce a
 n array that contains every item shared between all the\n  // passed-in arrays. (Aliased as \"intersect\" for back-compat.)\n  _.intersection = _.intersect = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.indexOf(other, item) >= 0;\n      });\n    });\n  };\n\n  // Take the difference between one array and a number of other arrays.\n  // Only the elements present in just the first array will remain.\n  _.difference = function(array) {\n    var rest = _.flatten(slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.include(rest, value); });\n  };\n\n  // Zip together multiple lists into a single array -- elements that share\n  // an index go together.\n  _.zip = function() {\n    var args = slice.call(arguments);\n    var length = _.max(_.pluck(args, 'length'));\n    var results = new Array(length);\n    for (var i = 0; i < lengt
 h; i++) results[i] = _.pluck(args, \"\" + i);\n    return results;\n  };\n\n  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),\n  // we need this function. Return the position of the first occurrence of an\n  // item in an array, or -1 if the item is not included in the array.\n  // Delegates to **ECMAScript 5**'s native `indexOf` if available.\n  // If the array is large and already in sort order, pass `true`\n  // for **isSorted** to use binary search.\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i, l;\n    if (isSorted) {\n      i = _.sortedIndex(array, item);\n      return array[i] === item ? i : -1;\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);\n    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;\n    return -1;\n  };\n\n  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.\n  _.lastIndexOf = f
 unction(array, item) {\n    if (array == null) return -1;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);\n    var i = array.length;\n    while (i--) if (i in array && array[i] === item) return i;\n    return -1;\n  };\n\n  // Generate an integer Array containing an arithmetic progression. A port of\n  // the native Python `range()` function. See\n  // [the Python documentation](http://docs.python.org/library/functions.html#range).\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var len = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(len);\n\n    while(idx < len) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n\n  // Function (ahem) Functions\n  // ------------------\n\n  // Reusable constructor function for prototype setting.\n
   var ctor = function(){};\n\n  // Create a function bound to a given object (assigning `this`, and arguments,\n  // optionally). Binding with arguments is also known as `curry`.\n  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.\n  // We check for `func.bind` first, to fail fast when `func` is undefined.\n  _.bind = function bind(func, context) {\n    var bound, args;\n    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError;\n    args = slice.call(arguments, 2);\n    return bound = function() {\n      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n      ctor.prototype = func.prototype;\n      var self = new ctor;\n      var result = func.apply(self, args.concat(slice.call(arguments)));\n      if (Object(result) === result) return result;\n      return self;\n    };\n  };\n\n  // Bind all of an object's methods to 
 that object. Useful for ensuring that\n  // all callbacks defined on an object belong to it.\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length == 0) funcs = _.functions(obj);\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n\n  // Memoize an expensive function by storing its results.\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n\n  // Delays a function for the given number of milliseconds, and then calls\n  // it with the arguments supplied.\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(func, args); }, wait);\n  };\n\n  // Defers a function, scheduling it to run after the current call stack
  has\n  // cleared.\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n\n  // Returns a function, that, when invoked, will only be triggered at most once\n  // during a given window of time.\n  _.throttle = function(func, wait) {\n    var context, args, timeout, throttling, more;\n    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);\n    return function() {\n      context = this; args = arguments;\n      var later = function() {\n        timeout = null;\n        if (more) func.apply(context, args);\n        whenDone();\n      };\n      if (!timeout) timeout = setTimeout(later, wait);\n      if (throttling) {\n        more = true;\n      } else {\n        func.apply(context, args);\n      }\n      whenDone();\n      throttling = true;\n    };\n  };\n\n  // Returns a function, that, as long as it continues to be invoked, will not\n  // be triggered. The function will be called after it stops being ca
 lled for\n  // N milliseconds.\n  _.debounce = function(func, wait) {\n    var timeout;\n    return function() {\n      var context = this, args = arguments;\n      var later = function() {\n        timeout = null;\n        func.apply(context, args);\n      };\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n    };\n  };\n\n  // Returns a function that will be executed at most one time, no matter how\n  // often you call it. Useful for lazy initialization.\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      return memo = func.apply(this, arguments);\n    };\n  };\n\n  // Returns the first function passed as an argument to the second,\n  // allowing you to adjust arguments, run code before and after, and\n  // conditionally execute the original function.\n  _.wrap = function(func, wrapper) {\n    return function() {\n      var args = [func].concat(slice.call(arguments, 0));\n 
      return wrapper.apply(this, args);\n    };\n  };\n\n  // Returns a function that is the composition of a list of functions, each\n  // consuming the return value of the function that follows.\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n\n  // Returns a function that will only be executed after being called N times.\n  _.after = function(times, func) {\n    if (times <= 0) return func();\n    return function() {\n      if (--times < 1) { return func.apply(this, arguments); }\n    };\n  };\n\n  // Object Functions\n  // ----------------\n\n  // Retrieve the names of an object's properties.\n  // Delegates to **ECMAScript 5**'s native `Object.keys`\n  _.keys = nativeKeys || function(obj) {\n    if (obj !== Object(obj)) throw new TypeError('Invalid object');\n    var keys = 
 [];\n    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;\n    return keys;\n  };\n\n  // Retrieve the values of an object's properties.\n  _.values = function(obj) {\n    return _.map(obj, _.identity);\n  };\n\n  // Return a sorted list of the function names available on the object.\n  // Aliased as `methods`\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n\n  // Extend a given object with all the properties in passed-in object(s).\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    });\n    return obj;\n  };\n\n  // Fill in a given object with default properties.\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      for (var prop in source) {\n        if (obj[prop] == null) 
 obj[prop] = source[prop];\n      }\n    });\n    return obj;\n  };\n\n  // Create a (shallow-cloned) duplicate of an object.\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n\n  // Invokes interceptor with the obj, and then returns obj.\n  // The primary purpose of this method is to \"tap into\" a method chain, in\n  // order to perform operations on intermediate results within the chain.\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n\n  // Internal recursive comparison function.\n  function eq(a, b, stack) {\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    // A strict comparison is necessary because `null == undefined`.\n    if (a == null || b == null) return a === b;\n    // Unwr
 ap any wrapped objects.\n    if (a._chain) a = a._wrapped;\n    if (b._chain) b = b._wrapped;\n    // Invoke a custom `isEqual` method if one is provided.\n    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);\n    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      // Strings, numbers, dates, and booleans are compared by value.\n      case '[object String]':\n        // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n        // equivalent to `new String(\"5\")`.\n        return a == String(b);\n      case '[object Number]':\n        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for\n        // other numeric values.\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[ob
 ject Boolean]':\n        // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n        // millisecond representations. Note that invalid dates with millisecond representations\n        // of `NaN` are not equivalent.\n        return +a == +b;\n      // RegExps are compared by their source patterns and flags.\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n    var length = stack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (stack[length] == a) return
  true;\n    }\n    // Add the first object to the stack of traversed objects.\n    stack.push(a);\n    var size = 0, result = true;\n    // Recursively compare objects and arrays.\n    if (className == '[object Array]') {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        // Deep compare the contents, ignoring non-numeric properties.\n        while (size--) {\n          // Ensure commutative equality for sparse arrays.\n          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;\n        }\n      }\n    } else {\n      // Objects with different constructors are not equivalent.\n      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;\n      // Deep compare objects.\n      for (var key in a) {\n        if (_.has(a, key)) {\n          // Count the expected number of properties.\n          size++;\n  
         // Deep compare each member.\n          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;\n        }\n      }\n      // Ensure that both objects contain the same number of properties.\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    // Remove the first object from the stack of traversed objects.\n    stack.pop();\n    return result;\n  }\n\n  // Perform a deep comparison to check if two objects are equal.\n  _.isEqual = function(a, b) {\n    return eq(a, b, []);\n  };\n\n  // Is a given array, string, or object empty?\n  // An \"empty\" object has no enumerable own-properties.\n  _.isEmpty = function(obj) {\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n\n  // Is a given value a DOM element?\n  _.isElement = function(obj) {\n    return !!(obj && obj
 .nodeType == 1);\n  };\n\n  // Is a given value an array?\n  // Delegates to ECMA5's native Array.isArray\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n\n  // Is a given variable an object?\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n\n  // Is a given variable an arguments object?\n  _.isArguments = function(obj) {\n    return toString.call(obj) == '[object Arguments]';\n  };\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n\n  // Is a given value a function?\n  _.isFunction = function(obj) {\n    return toString.call(obj) == '[object Function]';\n  };\n\n  // Is a given value a string?\n  _.isString = function(obj) {\n    return toString.call(obj) == '[object String]';\n  };\n\n  // Is a given value a number?\n  _.isNumber = function(obj) {\n    return toString.call(obj) == '[object Number]';\n  };\n\n  // Is t
 he given value `NaN`?\n  _.isNaN = function(obj) {\n    // `NaN` is the only value for which `===` is not reflexive.\n    return obj !== obj;\n  };\n\n  // Is a given value a boolean?\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n\n  // Is a given value a date?\n  _.isDate = function(obj) {\n    return toString.call(obj) == '[object Date]';\n  };\n\n  // Is the given value a regular expression?\n  _.isRegExp = function(obj) {\n    return toString.call(obj) == '[object RegExp]';\n  };\n\n  // Is a given value equal to null?\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n\n  // Is a given variable undefined?\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n\n  // Has own property?\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n\n  // Utility Functions\n  // -----------------\n\n  // Run Underscore.js in *noConflict* mode, returning th
 e `_` variable to its\n  // previous owner. Returns a reference to the Underscore object.\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n\n  // Keep the identity function around for default iterators.\n  _.identity = function(value) {\n    return value;\n  };\n\n  // Run a function **n** times.\n  _.times = function (n, iterator, context) {\n    for (var i = 0; i < n; i++) iterator.call(context, i);\n  };\n\n  // Escape a string for HTML interpolation.\n  _.escape = function(string) {\n    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\\//g,'&#x2F;');\n  };\n\n  // Add your own custom functions to the Underscore object, ensuring that\n  // they're correctly added to the OOP wrapper as well.\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name){\n      addToWrapper(name, _[name] = obj[name]);\n    });\n  };\n\n  // Generate a u
 nique integer id (unique within the entire client session).\n  // Useful for temporary DOM ids.\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = idCounter++;\n    return prefix ? prefix + id : id;\n  };\n\n  // By default, Underscore uses ERB-style template delimiters, change the\n  // following template settings to use alternative delimiters.\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n\n  // When customizing `templateSettings`, if you don't want to define an\n  // interpolation, evaluation or escaping regex, we need one that is\n  // guaranteed not to match.\n  var noMatch = /.^/;\n\n  // Within an interpolation, evaluation, or escaping, remove HTML escaping\n  // that had been previously added.\n  var unescape = function(code) {\n    return code.replace(/\\\\\\\\/g, '\\\\').replace(/\\\\'/g, \"'\");\n  };\n\n  // JavaScript micro-templating, similar 
 to John Resig's implementation.\n  // Underscore templating handles arbitrary delimiters, preserves whitespace,\n  // and correctly escapes quotes within interpolated code.\n  _.template = function(str, data) {\n    var c  = _.templateSettings;\n    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +\n      'with(obj||{}){__p.push(\\'' +\n      str.replace(/\\\\/g, '\\\\\\\\')\n         .replace(/'/g, \"\\\\'\")\n         .replace(c.escape || noMatch, function(match, code) {\n           return \"',_.escape(\" + unescape(code) + \"),'\";\n         })\n         .replace(c.interpolate || noMatch, function(match, code) {\n           return \"',\" + unescape(code) + \",'\";\n         })\n         .replace(c.evaluate || noMatch, function(match, code) {\n           return \"');\" + unescape(code).replace(/[\\r\\n\\t]/g, ' ') + \";__p.push('\";\n         })\n         .replace(/\\r/g, '\\\\r')\n         .replace(/\\n/g, '\\\\n')\n         .replace(/\\t/g, '\\\\t')\n  
        + \"');}return __p.join('');\";\n    var func = new Function('obj', '_', tmpl);\n    if (data) return func(data, _);\n    return function(data) {\n      return func.call(this, data, _);\n    };\n  };\n\n  // Add a \"chain\" function, which will delegate to the wrapper.\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n\n  // The OOP Wrapper\n  // ---------------\n\n  // If Underscore is called as a function, it returns a wrapped object that\n  // can be used OO-style. This wrapper holds altered versions of all the\n  // underscore functions. Wrapped objects may be chained.\n  var wrapper = function(obj) { this._wrapped = obj; };\n\n  // Expose `wrapper.prototype` as `_.prototype`\n  _.prototype = wrapper.prototype;\n\n  // Helper function to continue chaining intermediate results.\n  var result = function(obj, chain) {\n    return chain ? _(obj).chain() : obj;\n  };\n\n  // A method to easily add functions to the OOP wrapper.\n  var addToWrapper = function(name,
  func) {\n    wrapper.prototype[name] = function() {\n      var args = slice.call(arguments);\n      unshift.call(args, this._wrapped);\n      return result(func.apply(_, args), this._chain);\n    };\n  };\n\n  // Add all of the Underscore functions to the wrapper object.\n  _.mixin(_);\n\n  // Add all mutator Array functions to the wrapper.\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    wrapper.prototype[name] = function() {\n      var wrapped = this._wrapped;\n      method.apply(wrapped, arguments);\n      var length = wrapped.length;\n      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];\n      return result(wrapped, this._chain);\n    };\n  });\n\n  // Add all accessor Array functions to the wrapper.\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    wrapper.prototype[name] = function() {\n      return result(method.apply(
 this._wrapped, arguments), this._chain);\n    };\n  });\n\n  // Start chaining a wrapped Underscore object.\n  wrapper.prototype.chain = function() {\n    this._chain = true;\n    return this;\n  };\n\n  // Extracts the result from a wrapped and chained object.\n  wrapper.prototype.value = function() {\n    return this._wrapped;\n  };\n\n}).call(this);\n">>},
+      {<<"async">>,
+       <<"/*global setTimeout: false, console: false */\n(function () {\n\n    var async = {};\n\n    // global on the server, window in the browser\n    var root = this,\n        previous_async = root.async;\n\n    if (typeof module !== 'undefined' && module.exports) {\n        module.exports = async;\n    }\n    else {\n        root.async = async;\n    }\n\n    async.noConflict = function () {\n        root.async = previous_async;\n        return async;\n    };\n\n    //// cross-browser compatiblity functions ////\n\n    var _forEach = function (arr, iterator) {\n        if (arr.forEach) {\n            return arr.forEach(iterator);\n        }\n        for (var i = 0; i < arr.length; i += 1) {\n            iterator(arr[i], i, arr);\n        }\n    };\n\n    var _map = function (arr, iterator) {\n        if (arr.map) {\n            return arr.map(iterator);\n        }\n        var results = [];\n        _forEach(arr, function (x, i, a) {\n            results.push(iterator(x, i, a));
 \n        });\n        return results;\n    };\n\n    var _reduce = function (arr, iterator, memo) {\n        if (arr.reduce) {\n            return arr.reduce(iterator, memo);\n        }\n        _forEach(arr, function (x, i, a) {\n            memo = iterator(memo, x, i, a);\n        });\n        return memo;\n    };\n\n    var _keys = function (obj) {\n        if (Object.keys) {\n            return Object.keys(obj);\n        }\n        var keys = [];\n        for (var k in obj) {\n            if (obj.hasOwnProperty(k)) {\n                keys.push(k);\n            }\n        }\n        return keys;\n    };\n\n    var _indexOf = function (arr, item) {\n        if (arr.indexOf) {\n            return arr.indexOf(item);\n        }\n        for (var i = 0; i < arr.length; i += 1) {\n            if (arr[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    };\n\n    //// exported async module functions ////\n\n    //// nextTick implementation with b
 rowser-compatible fallback ////\n    if (typeof process === 'undefined' || !(process.nextTick)) {\n        async.nextTick = function (fn) {\n            setTimeout(fn, 0);\n        };\n    }\n    else {\n        async.nextTick = process.nextTick;\n    }\n\n    async.forEach = function (arr, iterator, callback) {\n        if (!arr.length) {\n            return callback();\n        }\n        var completed = 0;\n        _forEach(arr, function (x) {\n            iterator(x, function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    completed += 1;\n                    if (completed === arr.length) {\n                        callback();\n                    }\n                }\n            });\n        });\n    };\n\n    async.forEachSeries = function (arr, iterator, callback) {\n        if (!arr.length) {\n            return callback();\n        }\n    
     var completed = 0;\n        var iterate = function () {\n            iterator(arr[completed], function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    completed += 1;\n                    if (completed === arr.length) {\n                        callback();\n                    }\n                    else {\n                        iterate();\n                    }\n                }\n            });\n        };\n        iterate();\n    };\n    \n    async.forEachLimit = function (arr, limit, iterator, callback) {\n        if (!arr.length || limit <= 0) {\n            return callback(); \n        }\n        var completed = 0;\n        var started = 0;\n        var running = 0;\n        \n        (function replenish () {\n          if (completed === arr.length) {\n              return callback();\n          }\n          \n          while (running 
 < limit && started < arr.length) {\n            iterator(arr[started], function (err) {\n              if (err) {\n                  callback(err);\n                  callback = function () {};\n              }\n              else {\n                  completed += 1;\n                  running -= 1;\n                  if (completed === arr.length) {\n                      callback();\n                  }\n                  else {\n                      replenish();\n                  }\n              }\n            });\n            started += 1;\n            running += 1;\n          }\n        })();\n    };\n\n\n    var doParallel = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(null, [async.forEach].concat(args));\n        };\n    };\n    var doSeries = function (fn) {\n        return function () {\n            var args = Array.prototype.slice.call(arguments);\n            return fn.apply(nul
 l, [async.forEachSeries].concat(args));\n        };\n    };\n\n\n    var _asyncMap = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (err, v) {\n                results[x.index] = v;\n                callback(err);\n            });\n        }, function (err) {\n            callback(err, results);\n        });\n    };\n    async.map = doParallel(_asyncMap);\n    async.mapSeries = doSeries(_asyncMap);\n\n\n    // reduce only has a series version, as doing reduce in parallel won't\n    // work in many situations.\n    async.reduce = function (arr, memo, iterator, callback) {\n        async.forEachSeries(arr, function (x, callback) {\n            iterator(memo, x, function (err, v) {\n                memo = v;\n                callback(err);\n            });\n        }, function (er
 r) {\n            callback(err, memo);\n        });\n    };\n    // inject alias\n    async.inject = async.reduce;\n    // foldl alias\n    async.foldl = async.reduce;\n\n    async.reduceRight = function (arr, memo, iterator, callback) {\n        var reversed = _map(arr, function (x) {\n            return x;\n        }).reverse();\n        async.reduce(reversed, memo, iterator, callback);\n    };\n    // foldr alias\n    async.foldr = async.reduceRight;\n\n    var _filter = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.inde
 x;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.filter = doParallel(_filter);\n    async.filterSeries = doSeries(_filter);\n    // select alias\n    async.select = async.filter;\n    async.selectSeries = async.filterSeries;\n\n    var _reject = function (eachfn, arr, iterator, callback) {\n        var results = [];\n        arr = _map(arr, function (x, i) {\n            return {index: i, value: x};\n        });\n        eachfn(arr, function (x, callback) {\n            iterator(x.value, function (v) {\n                if (!v) {\n                    results.push(x);\n                }\n                callback();\n            });\n        }, function (err) {\n            callback(_map(results.sort(function (a, b) {\n                return a.index - b.index;\n            }), function (x) {\n                return x.value;\n            }));\n        });\n    };\n    async.reject = doParallel(_reject);\n    async.reje
 ctSeries = doSeries(_reject);\n\n    var _detect = function (eachfn, arr, iterator, main_callback) {\n        eachfn(arr, function (x, callback) {\n            iterator(x, function (result) {\n                if (result) {\n                    main_callback(x);\n                    main_callback = function () {};\n                }\n                else {\n                    callback();\n                }\n            });\n        }, function (err) {\n            main_callback();\n        });\n    };\n    async.detect = doParallel(_detect);\n    async.detectSeries = doSeries(_detect);\n\n    async.some = function (arr, iterator, main_callback) {\n        async.forEach(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (v) {\n                    main_callback(true);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(false);
 \n        });\n    };\n    // any alias\n    async.any = async.some;\n\n    async.every = function (arr, iterator, main_callback) {\n        async.forEach(arr, function (x, callback) {\n            iterator(x, function (v) {\n                if (!v) {\n                    main_callback(false);\n                    main_callback = function () {};\n                }\n                callback();\n            });\n        }, function (err) {\n            main_callback(true);\n        });\n    };\n    // all alias\n    async.all = async.every;\n\n    async.sortBy = function (arr, iterator, callback) {\n        async.map(arr, function (x, callback) {\n            iterator(x, function (err, criteria) {\n                if (err) {\n                    callback(err);\n                }\n                else {\n                    callback(null, {value: x, criteria: criteria});\n                }\n            });\n        }, function (err, results) {\n            if (err) {\n                r
 eturn callback(err);\n            }\n            else {\n                var fn = function (left, right) {\n                    var a = left.criteria, b = right.criteria;\n                    return a < b ? -1 : a > b ? 1 : 0;\n                };\n                callback(null, _map(results.sort(fn), function (x) {\n                    return x.value;\n                }));\n            }\n        });\n    };\n\n    async.auto = function (tasks, callback) {\n        callback = callback || function () {};\n        var keys = _keys(tasks);\n        if (!keys.length) {\n            return callback(null);\n        }\n\n        var results = {};\n\n        var listeners = [];\n        var addListener = function (fn) {\n            listeners.unshift(fn);\n        };\n        var removeListener = function (fn) {\n            for (var i = 0; i < listeners.length; i += 1) {\n                if (listeners[i] === fn) {\n                    listeners.splice(i, 1);\n                    return;\n 
                }\n            }\n        };\n        var taskComplete = function () {\n            _forEach(listeners, function (fn) {\n                fn();\n            });\n        };\n\n        addListener(function () {\n            if (_keys(results).length === keys.length) {\n                callback(null, results);\n            }\n        });\n\n        _forEach(keys, function (k) {\n            var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k];\n            var taskCallback = function (err) {\n                if (err) {\n                    callback(err);\n                    // stop subsequent errors hitting callback multiple times\n                    callback = function () {};\n                }\n                else {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                  
   taskComplete();\n                }\n            };\n            var requires = task.slice(0, Math.abs(task.length - 1)) || [];\n            var ready = function () {\n                return _reduce(requires, function (a, x) {\n                    return (a && results.hasOwnProperty(x));\n                }, true);\n            };\n            if (ready()) {\n                task[task.length - 1](taskCallback, results);\n            }\n            else {\n                var listener = function () {\n                    if (ready()) {\n                        removeListener(listener);\n                        task[task.length - 1](taskCallback, results);\n                    }\n                };\n                addListener(listener);\n            }\n        });\n    };\n\n    async.waterfall = function (tasks, callback) {\n        if (!tasks.length) {\n            return callback();\n        }\n        callback = callback || function () {};\n        var wrapIterator = function (it
 erator) {\n            return function (err) {\n                if (err) {\n                    callback(err);\n                    callback = function () {};\n                }\n                else {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    var next = iterator.next();\n                    if (next) {\n                        args.push(wrapIterator(next));\n                    }\n                    else {\n                        args.push(callback);\n                    }\n                    async.nextTick(function () {\n                        iterator.apply(null, args);\n                    });\n                }\n            };\n        };\n        wrapIterator(async.iterator(tasks))();\n    };\n\n    async.parallel = function (tasks, callback) {\n        callback = callback || function () {};\n        if (tasks.constructor === Array) {\n            async.map(tasks, function (fn, callback) {\n                if (fn) {\n   
                  fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            async.forEach(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, function (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.series = function (tasks, callback) {\n        callback = callb
 ack || function () {};\n        if (tasks.constructor === Array) {\n            async.mapSeries(tasks, function (fn, callback) {\n                if (fn) {\n                    fn(function (err) {\n                        var args = Array.prototype.slice.call(arguments, 1);\n                        if (args.length <= 1) {\n                            args = args[0];\n                        }\n                        callback.call(null, err, args);\n                    });\n                }\n            }, callback);\n        }\n        else {\n            var results = {};\n            async.forEachSeries(_keys(tasks), function (k, callback) {\n                tasks[k](function (err) {\n                    var args = Array.prototype.slice.call(arguments, 1);\n                    if (args.length <= 1) {\n                        args = args[0];\n                    }\n                    results[k] = args;\n                    callback(err);\n                });\n            }, func
 tion (err) {\n                callback(err, results);\n            });\n        }\n    };\n\n    async.iterator = function (tasks) {\n        var makeCallback = function (index) {\n            var fn = function () {\n                if (tasks.length) {\n                    tasks[index].apply(null, arguments);\n                }\n                return fn.next();\n            };\n            fn.next = function () {\n                return (index < tasks.length - 1) ? makeCallback(index + 1): null;\n            };\n            return fn;\n        };\n        return makeCallback(0);\n    };\n\n    async.apply = function (fn) {\n        var args = Array.prototype.slice.call(arguments, 1);\n        return function () {\n            return fn.apply(\n                null, args.concat(Array.prototype.slice.call(arguments))\n            );\n        };\n    };\n\n    var _concat = function (eachfn, arr, fn, callback) {\n        var r = [];\n        eachfn(arr, function (x, cb) {\n           
  fn(x, function (err, y) {\n                r = r.concat(y || []);\n                cb(err);\n            });\n        }, function (err) {\n            callback(err, r);\n        });\n    };\n    async.concat = doParallel(_concat);\n    async.concatSeries = doSeries(_concat);\n\n    async.whilst = function (test, iterator, callback) {\n        if (test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.whilst(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    async.until = function (test, iterator, callback) {\n        if (!test()) {\n            iterator(function (err) {\n                if (err) {\n                    return callback(err);\n                }\n                async.until(test, iterator, callback);\n            });\n        }\n        else {\n            callback();\n        }\n    };\n\n    
 async.queue = function (worker, concurrency) {\n        var workers = 0;\n        var q = {\n            tasks: [],\n            concurrency: concurrency,\n            saturated: null,\n            empty: null,\n            drain: null,\n            push: function (data, callback) {\n                q.tasks.push({data: data, callback: callback});\n                if(q.saturated && q.tasks.length == concurrency) q.saturated();\n                async.nextTick(q.process);\n            },\n            process: function () {\n                if (workers < q.concurrency && q.tasks.length) {\n                    var task = q.tasks.shift();\n                    if(q.empty && q.tasks.length == 0) q.empty();\n                    workers += 1;\n                    worker(task.data, function () {\n                        workers -= 1;\n                        if (task.callback) {\n                            task.callback.apply(task, arguments);\n                        }\n                     
    if(q.drain && q.tasks.length + workers == 0) q.drain();\n                        q.process();\n                    });\n                }\n            },\n            length: function () {\n                return q.tasks.length;\n            },\n            running: function () {\n                return workers;\n            }\n        };\n        return q;\n    };\n\n    var _console_fn = function (name) {\n        return function (fn) {\n            var args = Array.prototype.slice.call(arguments, 1);\n            fn.apply(null, args.concat([function (err) {\n                var args = Array.prototype.slice.call(arguments, 1);\n                if (typeof console !== 'undefined') {\n                    if (err) {\n                        if (console.error) {\n                            console.error(err);\n                        }\n                    }\n                    else if (console[name]) {\n                        _forEach(args, function (x) {\n                      
       console[name](x);\n                        });\n                    }\n                }\n            }]));\n        };\n    };\n    async.log = _console_fn('log');\n    async.dir = _console_fn('dir');\n    /*async.info = _console_fn('info');\n    async.warn = _console_fn('warn');\n    async.error = _console_fn('error');*/\n\n    async.memoize = function (fn, hasher) {\n        var memo = {};\n        var queues = {};\n        hasher = hasher || function (x) {\n            return x;\n        };\n        var memoized = function () {\n            var args = Array.prototype.slice.call(arguments);\n            var callback = args.pop();\n            var key = hasher.apply(null, args);\n            if (key in memo) {\n                callback.apply(null, memo[key]);\n            }\n            else if (key in queues) {\n                queues[key].push(callback);\n            }\n            else {\n                queues[key] = [callback];\n                fn.apply(null, args.conca
 t([function () {\n                    memo[key] = arguments;\n                    var q = queues[key];\n                    delete queues[key];\n                    for (var i = 0, l = q.length; i < l; i++) {\n                      q[i].apply(null, arguments);\n                    }\n                }]));\n            }\n        };\n        memoized.unmemoized = fn;\n        return memoized;\n    };\n\n    async.unmemoize = function (fn) {\n      return function () {\n        return (fn.unmemoized || fn).apply(null, arguments);\n      }\n    };\n\n}());\n">>},
+      {<<"handlebars">>,
+       <<47,47,32,108,105,98,47,104,97,110,100,108,101,98,97,114,115,47,98,97,115,
+         101,46,106,115,10,118,97,114,32,72,97,110,100,108,101,98,97,114,115,32,
+         61,32,123,125,59,10,10,72,97,110,100,108,101,98,97,114,115,46,86,69,82,
+         83,73,79,78,32,61,32,34,49,46,48,46,98,101,116,97,46,50,34,59,10,10,72,
+         97,110,100,108,101,98,97,114,115,46,104,101,108,112,101,114,115,32,32,61,
+         32,123,125,59,10,72,97,110,100,108,101,98,97,114,115,46,112,97,114,116,
+         105,97,108,115,32,61,32,123,125,59,10,10,72,97,110,100,108,101,98,97,114,
+         115,46,114,101,103,105,115,116,101,114,72,101,108,112,101,114,32,61,32,
+         102,117,110,99,116,105,111,110,40,110,97,109,101,44,32,102,110,44,32,105,
+         110,118,101,114,115,101,41,32,123,10,32,32,105,102,40,105,110,118,101,
+         114,115,101,41,32,123,32,102,110,46,110,111,116,32,61,32,105,110,118,101,
+         114,115,101,59,32,125,10,32,32,116,104,105,115,46,104,101,108,112,101,
+         114,115,91,110,97,109,101,93,32,61,32,102,110,59,10,125,59,10,10,72,97,
+         110,100,108,101,98,97,114,115,46,114,101,103,105,115,116,101,114,80,97,
+         114,116,105,97,108,32,61,32,102,117,110,99,116,105,111,110,40,110,97,109,
+         101,44,32,115,116,114,41,32,123,10,32,32,116,104,105,115,46,112,97,114,
+         116,105,97,108,115,91,110,97,109,101,93,32,61,32,115,116,114,59,10,125,
+         59,10,10,72,97,110,100,108,101,98,97,114,115,46,114,101,103,105,115,116,
+         101,114,72,101,108,112,101,114,40,39,104,101,108,112,101,114,77,105,115,
+         115,105,110,103,39,44,32,102,117,110,99,116,105,111,110,40,97,114,103,41,
+         32,123,10,32,32,105,102,40,97,114,103,117,109,101,110,116,115,46,108,101,
+         110,103,116,104,32,61,61,61,32,50,41,32,123,10,32,32,32,32,114,101,116,
+         117,114,110,32,117,110,100,101,102,105,110,101,100,59,10,32,32,125,32,
+         101,108,115,101,32,123,10,32,32,32,32,116,104,114,111,119,32,110,101,119,
+         32,69,114,114,111,114,40,34,67,111,117,108,100,32,110,111,116,32,102,105,
+         110,100,32,112,114,111,112,101,114,116,121,32,39,34,32,43,32,97,114,103,
+         32,43,32,34,39,34,41,59,10,32,32,125,10,125,41,59,10,10,72,97,110,100,
+         108,101,98,97,114,115,46,114,101,103,105,115,116,101,114,72,101,108,112,
+         101,114,40,39,98,108,111,99,107,72,101,108,112,101,114,77,105,115,115,
+         105,110,103,39,44,32,102,117,110,99,116,105,111,110,40,99,111,110,116,
+         101,120,116,44,32,111,112,116,105,111,110,115,41,32,123,10,32,32,118,97,
+         114,32,105,110,118,101,114,115,101,32,61,32,111,112,116,105,111,110,115,
+         46,105,110,118,101,114,115,101,32,124,124,32,102,117,110,99,116,105,111,
+         110,40,41,32,123,125,44,32,102,110,32,61,32,111,112,116,105,111,110,115,
+         46,102,110,59,10,10,10,32,32,118,97,114,32,114,101,116,32,61,32,34,34,59,
+         10,32,32,118,97,114,32,116,121,112,101,32,61,32,79,98,106,101,99,116,46,
+         112,114,111,116,111,116,121,112,101,46,116,111,83,116,114,105,110,103,46,
+         99,97,108,108,40,99,111,110,116,101,120,116,41,59,10,10,32,32,105,102,40,
+         116,121,112,101,32,61,61,61,32,34,91,111,98,106,101,99,116,32,70,117,110,
+         99,116,105,111,110,93,34,41,32,123,10,32,32,32,32,99,111,110,116,101,120,
+         116,32,61,32,99,111,110,116,101,120,116,40,41,59,10,32,32,125,10,10,32,
+         32,105,102,40,99,111,110,116,101,120,116,32,61,61,61,32,116,114,117,101,
+         41,32,123,10,32,32,32,32,114,101,116,117,114,110,32,102,110,40,116,104,
+         105,115,41,59,10,32,32,125,32,101,108,115,101,32,105,102,40,99,111,110,
+         116,101,120,116,32,61,61,61,32,102,97,108,115,101,32,124,124,32,99,111,
+         110,116,101,120,116,32,61,61,32,110,117,108,108,41,32,123,10,32,32,32,32,
+         114,101,116,117,114,110,32,105,110,118,101,114,115,101,40,116,104,105,
+         115,41,59,10,32,32,125,32,101,108,115,101,32,105,102,40,116,121,112,101,
+         32,61,61,61,32,34,91,111,98,106,101,99,116,32,65,114,114,97,121,93,34,41,
+         32,123,10,32,32,32,32,105,102,40,99,111,110,116,101,120,116,46,108,101,
+         110,103,116,104,32,62,32,48,41,32,123,10,32,32,32,32,32,32,102,111,114,
+         40,118,97,114,32,105,61,48,44,32,106,61,99,111,110,116,101,120,116,46,
+         108,101,110,103,116,104,59,32,105,60,106,59,32,105,43,43,41,32,123,10,32,
+         32,32,32,32,32,32,32,114,101,116,32,61,32,114,101,116,32,43,32,102,110,
+         40,99,111,110,116,101,120,116,91,105,93,41,59,10,32,32,32,32,32,32,125,
+         10,32,32,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,32,32,114,
+         101,116,32,61,32,105,110,118,101,114,115,101,40,116,104,105,115,41,59,10,
+         32,32,32,32,125,10,32,32,32,32,114,101,116,117,114,110,32,114,101,116,59,
+         10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,32,114,101,116,117,
+         114,110,32,102,110,40,99,111,110,116,101,120,116,41,59,10,32,32,125,10,
+         125,41,59,10,10,72,97,110,100,108,101,98,97,114,115,46,114,101,103,105,
+         115,116,101,114,72,101,108,112,101,114,40,39,101,97,99,104,39,44,32,102,
+         117,110,99,116,105,111,110,40,99,111,110,116,101,120,116,44,32,111,112,
+         116,105,111,110,115,41,32,123,10,32,32,118,97,114,32,102,110,32,61,32,
+         111,112,116,105,111,110,115,46,102,110,44,32,105,110,118,101,114,115,101,
+         32,61,32,111,112,116,105,111,110,115,46,105,110,118,101,114,115,101,59,
+         10,32,32,118,97,114,32,114,101,116,32,61,32,34,34,59,10,10,32,32,105,102,
+         40,99,111,110,116,101,120,116,32,38,38,32,99,111,110,116,101,120,116,46,
+         108,101,110,103,116,104,32,62,32,48,41,32,123,10,32,32,32,32,102,111,114,
+         40,118,97,114,32,105,61,48,44,32,106,61,99,111,110,116,101,120,116,46,
+         108,101,110,103,116,104,59,32,105,60,106,59,32,105,43,43,41,32,123,10,32,
+         32,32,32,32,32,114,101,116,32,61,32,114,101,116,32,43,32,102,110,40,99,
+         111,110,116,101,120,116,91,105,93,41,59,10,32,32,32,32,125,10,32,32,125,
+         32,101,108,115,101,32,123,10,32,32,32,32,114,101,116,32,61,32,105,110,
+         118,101,114,115,101,40,116,104,105,115,41,59,10,32,32,125,10,32,32,114,
+         101,116,117,114,110,32,114,101,116,59,10,125,41,59,10,10,72,97,110,100,
+         108,101,98,97,114,115,46,114,101,103,105,115,116,101,114,72,101,108,112,
+         101,114,40,39,105,102,39,44,32,102,117,110,99,116,105,111,110,40,99,111,
+         110,116,101,120,116,44,32,111,112,116,105,111,110,115,41,32,123,10,32,32,
+         105,102,40,33,99,111,110,116,101,120,116,32,124,124,32,72,97,110,100,108,
+         101,98,97,114,115,46,85,116,105,108,115,46,105,115,69,109,112,116,121,40,
+         99,111,110,116,101,120,116,41,41,32,123,10,32,32,32,32,114,101,116,117,
+         114,110,32,111,112,116,105,111,110,115,46,105,110,118,101,114,115,101,40,
+         116,104,105,115,41,59,10,32,32,125,32,101,108,115,101,32,123,10,32,32,32,
+         32,114,101,116,117,114,110,32,111,112,116,105,111,110,115,46,102,110,40,
+         116,104,105,115,41,59,10,32,32,125,10,125,41,59,10,10,72,97,110,100,108,
+         101,98,97,114,115,46,114,101,103,105,115,116,101,114,72,101,108,112,101,
+         114,40,39,117,110,108,101,115,115,39,44,32,102,117,110,99,116,105,111,
+         110,40,99,111,110,116,101,120,116,44,32,111,112,116,105,111,110,115,41,
+         32,123,10,32,32,118,97,114,32,102,110,32,61,32,111,112,116,105,111,110,
+         115,46,102,110,44,32,105,110,118,101,114,115,101,32,61,32,111,112,116,
+         105,111,110,115,46,105,110,118,101,114,115,101,59,10,32,32,111,112,116,
+         105,111,110,115,46,102,110,32,61,32,105,110,118,101,114,115,101,59,10,32,
+         32,111,112,116,105,111,110,115,46,105,110,118,101,114,115,101,32,61,32,
+         102,110,59,10,10,32,32,114,101,116,117,114,110,32,72,97,110,100,108,101,
+         98,97,114,115,46,104,101,108,112,101,114,115,91,39,105,102,39,93,46,99,
+         97,108,108,40,116,104,105,115,44,32,99,111,110,116,101,120,116,44,32,111,
+         112,116,105,111,110,115,41,59,10,125,41,59,10,10,72,97,110,100,108,101,
+         98,97,114,115,46,114,101,103,105,115,116,101,114,72,101,108,112,101,114,
+         40,39,119,105,116,104,39,44,32,102,117,110,99,116,105,111,110,40,99,111,
+         110,116,101,120,116,44,32,111,112,116,105,111,110,115,41,32,123,10,32,32,
+         114,101,116,117,114,110,32,111,112,116,105,111,110,115,46,102,110,40,99,
+         111,110,116,101,120,116,41,59,10,125,41,59,10,59,10,47,47,32,108,105,98,
+         47,104,97,110,100,108,101,98,97,114,115,47,99,111,109,112,105,108,101,
+         114,47,112,97,114,115,101,114,46,106,115,10,47,42,32,74,105,115,111,110,
+         32,103,101,110,101,114,97,116,101,100,32,112,97,114,115,101,114,32,42,47,
+         10,118,97,114,32,104,97,110,100,108,101,98,97,114,115,32,61,32,40,102,
+         117,110,99,116,105,111,110,40,41,123,10,10,118,97,114,32,112,97,114,115,
+         101,114,32,61,32,123,116,114,97,99,101,58,32,102,117,110,99,116,105,111,
+         110,32,116,114,97,99,101,40,41,32,123,32,125,44,10,121,121,58,32,123,125,
+         44,10,115,121,109,98,111,108,115,95,58,32,123,34,101,114,114,111,114,34,
+         58,50,44,34,114,111,111,116,34,58,51,44,34,112,114,111,103,114,97,109,34,
+         58,52,44,34,69,79,70,34,58,53,44,34,115,116,97,116,101,109,101,110,116,
+         115,34,58,54,44,34,115,105,109,112,108,101,73,110,118,101,114,115,101,34,
+         58,55,44,34,115,116,97,116,101,109,101,110,116,34,58,56,44,34,111,112,
+         101,110,73,110,118,101,114,115,101,34,58,57,44,34,99,108,111,115,101,66,
+         108,111,99,107,34,58,49,48,44,34,111,112,101,110,66,108,111,99,107,34,58,
+         49,49,44,34,109,117,115,116,97,99,104,101,34,58,49,50,44,34,112,97,114,
+         116,105,97,108,34,58,49,51,44,34,67,79,78,84,69,78,84,34,58,49,52,44,34,
+         67,79,77,77,69,78,84,34,58,49,53,44,34,79,80,69,78,95,66,76,79,67,75,34,
+         58,49,54,44,34,105,110,77,117,115,116,97,99,104,101,34,58,49,55,44,34,67,
+         76,79,83,69,34,58,49,56,44,34,79,80,69,78,95,73,78,86,69,82,83,69,34,58,
+         49,57,44,34,79,80,69,78,95,69,78,68,66,76,79,67,75,34,58,50,48,44,34,112,
+         97,116,104,34,58,50,49,44,34,79,80,69,78,34,58,50,50,44,34,79,80,69,78,
+         95,85,78,69,83,67,65,80,69,68,34,58,50,51,44,34,79,80,69,78,95,80,65,82,
+         84,73,65,76,34,58,50,52,44,34,112,97,114,97,109,115,34,58,50,53,44,34,
+         104,97,115,104,34,58,50,54,44,34,112,97,114,97,109,34,58,50,55,44,34,83,
+         84,82,73,78,71,34,58,50,56,44,34,73,78,84,69,71,69,82,34,58,50,57,44,34,
+         66,79,79,76,69,65,78,34,58,51,48,44,34,104,97,115,104,83,101,103,109,101,
+         110,116,115,34,58,51,49,44,34,104,97,115,104,83,101,103,109,101,110,116,
+         34,58,51,50,44,34,73,68,34,58,51,51,44,34,69,81,85,65,76,83,34,58,51,52,
+         44,34,112,97,116,104,83,101,103,109,101,110,116,115,34,58,51,53,44,34,83,
+         69,80,34,58,51,54,44,34,36,97,99,99,101,112,116,34,58,48,44,34,36,101,
+         110,100,34,58,49,125,44,10,116,101,114,109,105,110,97,108,115,95,58,32,
+         123,50,58,34,101,114,114,111,114,34,44,53,58,34,69,79,70,34,44,49,52,58,
+         34,67,79,78,84,69,78,84,34,44,49,53,58,34,67,79,77,77,69,78,84,34,44,49,
+         54,58,34,79,80,69,78,95,66,76,79,67,75,34,44,49,56,58,34,67,76,79,83,69,
+         34,44,49,57,58,34,79,80,69,78,95,73,78,86,69,82,83,69,34,44,50,48,58,34,
+         79,80,69,78,95,69,78,68,66,76,79,67,75,34,44,50,50,58,34,79,80,69,78,34,
+         44,50,51,58,34,79,80,69,78,95,85,78,69,83,67,65,80,69,68,34,44,50,52,58,
+         34,79,80,69,78,95,80,65,82,84,73,65,76,34,44,50,56,58,34,83,84,82,73,78,
+         71,34,44,50,57,58,34,73,78,84,69,71,69,82,34,44,51,48,58,34,66,79,79,76,
+         69,65,78,34,44,51,51,58,34,73,68,34,44,51,52,58,34,69,81,85,65,76,83,34,
+         44,51,54,58,34,83,69,80,34,125,44,10,112,114,111,100,117,99,116,105,111,
+         110,115,95,58,32,91,48,44,91,51,44,50,93,44,91,52,44,51,93,44,91,52,44,
+         49,93,44,91,52,44,48,93,44,91,54,44,49,93,44,91,54,44,50,93,44,91,56,44,
+         51,93,44,91,56,44,51,93,44,91,56,44,49,93,44,91,56,44,49,93,44,91,56,44,
+         49,93,44,91,56,44,49,93,44,91,49,49,44,51,93,44,91,57,44,51,93,44,91,49,
+         48,44,51,93,44,91,49,50,44,51,93,44,91,49,50,44,51,93,44,91,49,51,44,51,
+         93,44,91,49,51,44,52,93,44,91,55,44,50,93,44,91,49,55,44,51,93,44,91,49,
+         55,44,50,93,44,91,49,55,44,50,93,44,91,49,55,44,49,93,44,91,50,53,44,50,
+         93,44,91,50,53,44,49,93,44,91,50,55,44,49,93,44,91,50,55,44,49,93,44,91,
+         50,55,44,49,93,44,91,50,55,44,49,93,44,91,50,54,44,49,93,44,91,51,49,44,
+         50,93,44,91,51,49,44,49,93,44,91,51,50,44,51,93,44,91,51,50,44,51,93,44,
+         91,51,50,44,51,93,44,91,51,50,44,51,93,44,91,50,49,44,49,93,44,91,51,53,
+         44,51,93,44,91,51,53,44,49,93,93,44,10,112,101,114,102,111,114,109,65,99,
+         116,105,111,110,58,32,102,117,110,99,116,105,111,110,32,97,110,111,110,
+         121,109,111,117,115,40,121,121,116,101,120,116,44,121,121,108,101,110,
+         103,44,121,121,108,105,110,101,110,111,44,121,121,44,121,121,115,116,97,
+         116,101,44,36,36,44,95,36,41,32,123,10,10,118,97,114,32,36,48,32,61,32,
+         36,36,46,108,101,110,103,116,104,32,45,32,49,59,10,115,119,105,116,99,
+         104,32,40,121,121,115,116,97,116,101,41,32,123,10,99,97,115,101,32,49,58,
+         32,114,101,116,117,114,110,32,36,36,91,36,48,45,49,93,32,10,98,114,101,
+         97,107,59,10,99,97,115,101,32,50,58,32,116,104,105,115,46,36,32,61,32,
+         110,101,119,32,121,121,46,80,114,111,103,114,97,109,78,111,100,101,40,36,
+         36,91,36,48,45,50,93,44,32,36,36,91,36,48,93,41,32,10,98,114,101,97,107,
+         59,10,99,97,115,101,32,51,58,32,116,104,105,115,46,36,32,61,32,110,101,
+         119,32,121,121,46,80,114,111,103,114,97,109,78,111,100,101,40,36,36,91,
+         36,48,93,41,32,10,98,114,101,97,107,59,10,99,97,115,101,32,52,58,32,116,
+         104,105,115,46,36,32,61,32,110,101,119,32,121,121,46,80,114,111,103,114,
+         97,109,78,111,100,101,40,91,93,41,32,10,98,114,101,97,107,59,10,99,97,
+         115,101,32,53,58,32,116,104,105,115,46,36,32,61,32,91,36,36,91,36,48,93,
+         93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,54,58,32,36,36,91,36,
+         48,45,49,93,46,112,117,115,104,40,36,36,91,36,48,93,41,59,32,116,104,105,
+         115,46,36,32,61,32,36,36,91,36,48,45,49,93,32,10,98,114,101,97,107,59,10,
+         99,97,115,101,32,55,58,32,116,104,105,115,46,36,32,61,32,110,101,119,32,
+         121,121,46,73,110,118,101,114,115,101,78,111,100,101,40,36,36,91,36,48,
+         45,50,93,44,32,36,36,91,36,48,45,49,93,44,32,36,36,91,36,48,93,41,32,10,
+         98,114,101,97,107,59,10,99,97,115,101,32,56,58,32,116,104,105,115,46,36,
+         32,61,32,110,101,119,32,121,121,46,66,108,111,99,107,78,111,100,101,40,
+         36,36,91,36,48,45,50,93,44,32,36,36,91,36,48,45,49,93,44,32,36,36,91,36,
+         48,93,41,32,10,98,114,101,97,107,59,10,99,97,115,101,32,57,58,32,116,104,
+         105,115,46,36,32,61,32,36,36,91,36,48,93,32,10,98,114,101,97,107,59,10,
+         99,97,115,101,32,49,48,58,32,116,104,105,115,46,36,32,61,32,36,36,91,36,
+         48,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,49,49,58,32,116,104,
+         105,115,46,36,32,61,32,110,101,119,32,121,121,46,67,111,110,116,101,110,
+         116,78,111,100,101,40,36,36,91,36,48,93,41,32,10,98,114,101,97,107,59,10,
+         99,97,115,101,32,49,50,58,32,116,104,105,115,46,36,32,61,32,110,101,119,
+         32,121,121,46,67,111,109,109,101,110,116,78,111,100,101,40,36,36,91,36,
+         48,93,41,32,10,98,114,101,97,107,59,10,99,97,115,101,32,49,51,58,32,116,
+         104,105,115,46,36,32,61,32,110,101,119,32,121,121,46,77,117,115,116,97,
+         99,104,101,78,111,100,101,40,36,36,91,36,48,45,49,93,91,48,93,44,32,36,
+         36,91,36,48,45,49,93,91,49,93,41,32,10,98,114,101,97,107,59,10,99,97,115,
+         101,32,49,52,58,32,116,104,105,115,46,36,32,61,32,110,101,119,32,121,121,
+         46,77,117,115,116,97,99,104,101,78,111,100,101,40,36,36,91,36,48,45,49,
+         93,91,48,93,44,32,36,36,91,36,48,45,49,93,91,49,93,41,32,10,98,114,101,
+         97,107,59,10,99,97,115,101,32,49,53,58,32,116,104,105,115,46,36,32,61,32,
+         36,36,91,36,48,45,49,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,
+         49,54,58,32,116,104,105,115,46,36,32,61,32,110,101,119,32,121,121,46,77,
+         117,115,116,97,99,104,101,78,111,100,101,40,36,36,91,36,48,45,49,93,91,
+         48,93,44,32,36,36,91,36,48,45,49,93,91,49,93,41,32,10,98,114,101,97,107,
+         59,10,99,97,115,101,32,49,55,58,32,116,104,105,115,46,36,32,61,32,110,
+         101,119,32,121,121,46,77,117,115,116,97,99,104,101,78,111,100,101,40,36,
+         36,91,36,48,45,49,93,91,48,93,44,32,36,36,91,36,48,45,49,93,91,49,93,44,
+         32,116,114,117,101,41,32,10,98,114,101,97,107,59,10,99,97,115,101,32,49,
+         56,58,32,116,104,105,115,46,36,32,61,32,110,101,119,32,121,121,46,80,97,
+         114,116,105,97,108,78,111,100,101,40,36,36,91,36,48,45,49,93,41,32,10,98,
+         114,101,97,107,59,10,99,97,115,101,32,49,57,58,32,116,104,105,115,46,36,
+         32,61,32,110,101,119,32,121,121,46,80,97,114,116,105,97,108,78,111,100,
+         101,40,36,36,91,36,48,45,50,93,44,32,36,36,91,36,48,45,49,93,41,32,10,98,
+         114,101,97,107,59,10,99,97,115,101,32,50,48,58,32,10,98,114,101,97,107,
+         59,10,99,97,115,101,32,50,49,58,32,116,104,105,115,46,36,32,61,32,91,91,
+         36,36,91,36,48,45,50,93,93,46,99,111,110,99,97,116,40,36,36,91,36,48,45,
+         49,93,41,44,32,36,36,91,36,48,93,93,32,10,98,114,101,97,107,59,10,99,97,
+         115,101,32,50,50,58,32,116,104,105,115,46,36,32,61,32,91,91,36,36,91,36,
+         48,45,49,93,93,46,99,111,110,99,97,116,40,36,36,91,36,48,93,41,44,32,110,
+         117,108,108,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,50,51,58,
+         32,116,104,105,115,46,36,32,61,32,91,91,36,36,91,36,48,45,49,93,93,44,32,
+         36,36,91,36,48,93,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,50,
+         52,58,32,116,104,105,115,46,36,32,61,32,91,91,36,36,91,36,48,93,93,44,32,
+         110,117,108,108,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,50,53,
+         58,32,36,36,91,36,48,45,49,93,46,112,117,115,104,40,36,36,91,36,48,93,41,
+         59,32,116,104,105,115,46,36,32,61,32,36,36,91,36,48,45,49,93,59,32,10,98,
+         114,101,97,107,59,10,99,97,115,101,32,50,54,58,32,116,104,105,115,46,36,
+         32,61,32,91,36,36,91,36,48,93,93,32,10,98,114,101,97,107,59,10,99,97,115,
+         101,32,50,55,58,32,116,104,105,115,46,36,32,61,32,36,36,91,36,48,93,32,
+         10,98,114,101,97,107,59,10,99,97,115,101,32,50,56,58,32,116,104,105,115,
+         46,36,32,61,32,110,101,119,32,121,121,46,83,116,114,105,110,103,78,111,
+         100,101,40,36,36,91,36,48,93,41,32,10,98,114,101,97,107,59,10,99,97,115,
+         101,32,50,57,58,32,116,104,105,115,46,36,32,61,32,110,101,119,32,121,121,
+         46,73,110,116,101,103,101,114,78,111,100,101,40,36,36,91,36,48,93,41,32,
+         10,98,114,101,97,107,59,10,99,97,115,101,32,51,48,58,32,116,104,105,115,
+         46,36,32,61,32,110,101,119,32,121,121,46,66,111,111,108,101,97,110,78,
+         111,100,101,40,36,36,91,36,48,93,41,32,10,98,114,101,97,107,59,10,99,97,
+         115,101,32,51,49,58,32,116,104,105,115,46,36,32,61,32,110,101,119,32,121,
+         121,46,72,97,115,104,78,111,100,101,40,36,36,91,36,48,93,41,32,10,98,114,
+         101,97,107,59,10,99,97,115,101,32,51,50,58,32,36,36,91,36,48,45,49,93,46,
+         112,117,115,104,40,36,36,91,36,48,93,41,59,32,116,104,105,115,46,36,32,
+         61,32,36,36,91,36,48,45,49,93,32,10,98,114,101,97,107,59,10,99,97,115,
+         101,32,51,51,58,32,116,104,105,115,46,36,32,61,32,91,36,36,91,36,48,93,
+         93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,51,52,58,32,116,104,
+         105,115,46,36,32,61,32,91,36,36,91,36,48,45,50,93,44,32,36,36,91,36,48,
+         93,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,51,53,58,32,116,104,
+         105,115,46,36,32,61,32,91,36,36,91,36,48,45,50,93,44,32,110,101,119,32,
+         121,121,46,83,116,114,105,110,103,78,111,100,101,40,36,36,91,36,48,93,41,
+         93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,51,54,58,32,116,104,
+         105,115,46,36,32,61,32,91,36,36,91,36,48,45,50,93,44,32,110,101,119,32,
+         121,121,46,73,110,116,101,103,101,114,78,111,100,101,40,36,36,91,36,48,
+         93,41,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,51,55,58,32,116,
+         104,105,115,46,36,32,61,32,91,36,36,91,36,48,45,50,93,44,32,110,101,119,
+         32,121,121,46,66,111,111,108,101,97,110,78,111,100,101,40,36,36,91,36,48,
+         93,41,93,32,10,98,114,101,97,107,59,10,99,97,115,101,32,51,56,58,32,116,
+         104,105,115,46,36,32,61,32,110,101,119,32,121,121,46,73,100,78,111,100,
+         101,40,36,36,91,36,48,93,41,32,10,98,114,101,97,107,59,10,99,97,115,101,
+         32,51,57,58,32,36,36,91,36,48,45,50,93,46,112,117,115,104,40,36,36,91,36,
+         48,93,41,59,32,116,104,105,115,46,36,32,61,32,36,36,91,36,48,45,50,93,59,
+         32,10,98,114,101,97,107,59,10,99,97,115,101,32,52,48,58,32,116,104,105,
+         115,46,36,32,61,32,91,36,36,91,36,48,93,93,32,10,98,114,101,97,107,59,10,
+         125,10,125,44,10,116,97,98,108,101,58,32,91,123,51,58,49,44,52,58,50,44,
+         53,58,91,50,44,52,93,44,54,58,51,44,56,58,52,44,57,58,53,44,49,49,58,54,
+         44,49,50,58,55,44,49,51,58,56,44,49,52,58,91,49,44,57,93,44,49,53,58,91,
+         49,44,49,48,93,44,49,54,58,91,49,44,49,50,93,44,49,57,58,91,49,44,49,49,
+         93,44,50,50,58,91,49,44,49,51,93,44,50,51,58,91,49,44,49,52,93,44,50,52,
+         58,91,49,44,49,53,93,125,44,123,49,58,91,51,93,125,44,123,53,58,91,49,44,
+         49,54,93,125,44,123,53,58,91,50,44,51,93,44,55,58,49,55,44,56,58,49,56,
+         44,57,58,53,44,49,49,58,54,44,49,50,58,55,44,49,51,58,56,44,49,52,58,91,
+         49,44,57,93,44,49,53,58,91,49,44,49,48,93,44,49,54,58,91,49,44,49,50,93,
+         44,49,57,58,91,49,44,49,57,93,44,50,48,58,91,50,44,51,93,44,50,50,58,91,
+         49,44,49,51,93,44,50,51,58,91,49,44,49,52,93,44,50,52,58,91,49,44,49,53,
+         93,125,44,123,53,58,91,50,44,53,93,44,49,52,58,91,50,44,53,93,44,49,53,
+         58,91,50,44,53,93,44,49,54,58,91,50,44,53,93,44,49,57,58,91,50,44,53,93,
+         44,50,48,58,91,50,44,53,93,44,50,50,58,91,50,44,53,93,44,50,51,58,91,50,
+         44,53,93,44,50,52,58,91,50,44,53,93,125,44,123,52,58,50,48,44,54,58,51,
+         44,56,58,52,44,57,58,53,44,49,49,58,54,44,49,50,58,55,44,49,51,58,56,44,
+         49,52,58,91,49,44,57,93,44,49,53,58,91,49,44,49,48,93,44,49,54,58,91,49,
+         44,49,50,93,44,49,57,58,91,49,44,49,49,93,44,50,48,58,91,50,44,52,93,44,
+         50,50,58,91,49,44,49,51,93,44,50,51,58,91,49,44,49,52,93,44,50,52,58,91,
+         49,44,49,53,93,125,44,123,52,58,50,49,44,54,58,51,44,56,58,52,44,57,58,
+         53,44,49,49,58,54,44,49,50,58,55,44,49,51,58,56,44,49,52,58,91,49,44,57,
+         93,44,49,53,58,91,49,44,49,48,93,44,49,54,58,91,49,44,49,50,93,44,49,57,
+         58,91,49,44,49,49,93,44,50,48,58,91,50,44,52,93,44,50,50,58,91,49,44,49,
+         51,93,44,50,51,58,91,49,44,49,52,93,44,50,52,58,91,49,44,49,53,93,125,44,
+         123,53,58,91,50,44,57,93,44,49,52,58,91,50,44,57,93,44,49,53,58,91,50,44,
+         57,93,44,49,54,58,91,50,44,57,93,44,49,57,58,91,50,44,57,93,44,50,48,58,
+         91,50,44,57,93,44,50,50,58,91,50,44,57,93,44,50,51,58,91,50,44,57,93,44,
+         50,52,58,91,50,44,57,93,125,44,123,53,58,91,50,44,49,48,93,44,49,52,58,
+         91,50,44,49,48,93,44,49,53,58,91,50,44,49,48,93,44,49,54,58,91,50,44,49,
+         48,93,44,49,57,58,91,50,44,49,48,93,44,50,48,58,91,50,44,49,48,93,44,50,
+         50,58,91,50,44,49,48,93,44,50,51,58,91,50,44,49,48,93,44,50,52,58,91,50,
+         44,49,48,93,125,44,123,53,58,91,50,44,49,49,93,44,49,52,58,91,50,44,49,
+         49,93,44,49,53,58,91,50,44,49,49,93,44,49,54,58,91,50,44,49,49,93,44,49,
+         57,58,91,50,44,49,49,93,44,50,48,58,91,50,44,49,49,93,44,50,50,58,91,50,
+         44,49,49,93,44,50,51,58,91,50,44,49,49,93,44,50,52,58,91,50,44,49,49,93,
+         125,44,123,53,58,91,50,44,49,50,93,44,49,52,58,91,50,44,49,50,93,44,49,
+         53,58,91,50,44,49,50,93,44,49,54,58,91,50,44,49,50,93,44,49,57,58,91,50,
+         44,49,50,93,44,50,48,58,91,50,44,49,50,93,44,50,50,58,91,50,44,49,50,93,
+         44,50,51,58,91,50,44,49,50,93,44,50,52,58,91,50,44,49,50,93,125,44,123,
+         49,55,58,50,50,44,50,49,58,50,51,44,51,51,58,91,49,44,50,53,93,44,51,53,
+         58,50,52,125,44,123,49,55,58,50,54,44,50,49,58,50,51,44,51,51,58,91,49,
+         44,50,53,93,44,51,53,58,50,52,125,44,123,49,55,58,50,55,44,50,49,58,50,
+         51,44,51,51,58,91,49,44,50,53,93,44,51,53,58,50,52,125,44,123,49,55,58,
+         50,56,44,50,49,58,50,51,44,51,51,58,91,49,44,50,53,93,44,51,53,58,50,52,
+         125,44,123,50,49,58,50,57,44,51,51,58,91,49,44,50,53,93,44,51,53,58,50,
+         52,125,44,123,49,58,91,50,44,49,93,125,44,123,54,58,51,48,44,56,58,52,44,
+         57,58,53,44,49,49,58,54,44,49,50,58,55,44,49,51,58,56,44,49,52,58,91,49,
+         44,57,93,44,49,53,58,91,49,44,49,48,93,44,49,54,58,91,49,44,49,50,93,44,
+         49,57,58,91,49,44,49,49,93,44,50,50,58,91,49,44,49,51,93,44,50,51,58,91,
+         49,44,49,52,93,44,50,52,58,91,49,44,49,53,93,125,44,123,53,58,91,50,44,
+         54,93,44,49,52,58,91,50,44,54,93,44,49,53,58,91,50,44,54,93,44,49,54,58,
+         91,50,44,54,93,44,49,57,58,91,50,44,54,93,44,50,48,58,91,50,44,54,93,44,
+         50,50,58,91,50,44,54,93,44,50,51,58,91,50,44,54,93,44,50,52,58,91,50,44,
+         54,93,125,44,123,49,55,58,50,50,44,49,56,58,91,49,44,51,49,93,44,50,49,
+         58,50,51,44,51,51,58,91,49,44,50,53,93,44,51,53,58,50,52,125,44,123,49,
+         48,58,51,50,44,50,48,58,91,49,44,51,51,93,125,44,123,49,48,58,51,52,44,
+         50,48,58,91,49,44,51,51,93,125,44,123,49,56,58,91,49,44,51,53,93,125,44,
+         123,49,56,58,91,50,44,50,52,93,44,50,49,58,52,48,44,50,53,58,51,54,44,50,
+         54,58,51,55,44,50,55,58,51,56,44,50,56,58,91,49,44,52,49,93,44,50,57,58,
+         91,49,44,52,50,93,44,51,48,58,91,49,44,52,51,93,44,51,49,58,51,57,44,51,
+         50,58,52,52,44,51,51,58,91,49,44,52,53,93,44,51,53,58,50,52,125,44,123,
+         49,56,58,91,50,44,51,56,93,44,50,56,58,91,50,44,51,56,93,44,50,57,58,91,
+         50,44,51,56,93,44,51,48,58,91,50,44,51,56,93,44,51,51,58,91,50,44,51,56,
+         93,44,51,54,58,91,49,44,52,54,93,125,44,123,49,56,58,91,50,44,52,48,93,
+         44,50,56,58,91,50,44,52,48,93,44,50,57,58,91,50,44,52,48,93,44,51,48,58,
+         91,50,44,52,48,93,44,51,51,58,91,50,44,52,48,93,44,51,54,58,91,50,44,52,
+         48,93,125,44,123,49,56,58,91,49,44,52,55,93,125,44,123,49,56,58,91,49,44,
+         52,56,93,125,44,123,49,56,58,91,49,44,52,57,93,125,44,123,49,56,58,91,49,
+         44,53,48,93,44,50,49,58,53,49,44,51,51,58,91,49,44,50,53,93,44,51,53,58,
+         50,52,125,44,123,53,58,91,50,44,50,93,44,56,58,49,56,44,57,58,53,44,49,
+         49,58,54,44,49,50,58,55,44,49,51,58,

<TRUNCATED>