Added immutable sets and maps

Added immutable sets and maps

--- src/js/app/compilers/teascript/compiler.coffee
+++ src/js/app/compilers/teascript/compiler.coffee
@@ -439,7 +439,7 @@
     else if isTuple expression
       tupleCompile
     else if isSeq expression
-      seqCompile
+      seqOrMapCompile
     else if isCall expression
       callCompile
   if not compileFn
@@ -680,6 +680,13 @@
     # "[#{listOf compiledElems}]"
     assignCompile ctx, form, (jsArray compiledElems)

+seqOrMapCompile = (ctx, form) ->
+  elems = _terms form
+  (if (_notEmpty elems) and isLabel elems[0]
+    hashmapCompile
+  else
+    seqCompile) ctx, form
+
 seqCompile = (ctx, form) ->
   elems = _terms form
   size = elems.length
@@ -732,15 +739,8 @@
     # expressionCompile ctx, arrayToConses elems
     # result =>         "[#{listOf map _compiled, elems}]"

-    elemType = ctx.freshTypeVariable star
-    compiledElems = termsCompile ctx, elems
-    for elem in elems
-      unify ctx, elemType, elem.tea.type
-
-    form.label = 'operator'
-    form.tea = new Constrained (concatMap _constraints, (tea for {tea} in elems)),
-      new TypeApp arrayType, elemType
-    assignCompile ctx, form, (jsArray compiledElems)
+    compiledItems = uniformCollectionCompile ctx, form, elems, arrayType
+    assignCompile ctx, form, (jsArray compiledItems)

 isSplat = (expression) ->
   (isAtom expression) and (_symbol expression)[...2] is '..'
@@ -748,6 +748,27 @@
 splatToName = (splat) ->
   replicate splat,
     (token_ (_symbol splat)[2...])
+
+hashmapCompile = (ctx, form) ->
+  if hashmap = ctx.assignTo()
+    # TODO:
+    throw new Error "matching on hash maps not supported yet"
+  else
+    [labels, items] = unzip pairs _terms form
+    keyType = new TypeApp hashmapType, stringType
+    compiledItems = uniformCollectionCompile ctx, form, items, keyType
+    keys = (map (__ string_, _labelName), labels)
+    assignCompile ctx, form, (irMap keys, compiledItems)
+
+uniformCollectionCompile = (ctx, form, items, collectionType) ->
+  itemType = ctx.freshTypeVariable star
+  compiledItems = termsCompile ctx, items
+  for item in items
+    unify ctx, itemType, item.tea.type
+  form.label = 'operator' if not isCall form
+  form.tea = new Constrained (concatMap _constraints, (tea for {tea} in items)),
+    new TypeApp collectionType, itemType
+  compiledItems

 # arrayToConses = (elems) ->
 #   if elems.length is 0
@@ -872,7 +893,7 @@
     currentType = substitute ctx.substitution, type
     deps = ctx.deferredNames()
     if deps.length > 0
-      # log "adding top level lhs to deferred #{name}"
+      # log "adding top level lhs to deferred #{name}", deps
       ctx.addToDeferred {name, type, deps: (map (({name}) -> name), deps)}
       for dep in deps
         ctx.addToDeferred {name: dep.name, type: dep.type, deps: [name]}
@@ -1449,7 +1470,7 @@
     callTyping ctx, call
     assignCompile ctx, call, macroFn args...

-for jsMethod in ['binary', 'ternary', 'unary']
+for jsMethod in ['binary', 'ternary', 'unary', 'access', 'call']
   do (jsMethod) ->
     ms["Js.#{jsMethod}"] = (ctx, call) ->
       call.tea = toConstrained typeConstant "JS"
@@ -1463,6 +1484,15 @@

     callTyping ctx, call
     assignCompile ctx, call, (jsBinary "===", compiledA, compiledB)
+
+ms.Set = ms_Set = (ctx, call) ->
+  if hashset = ctx.assignTo()
+    # TODO:
+    throw new Error "matching on sets not supported yet"
+  else
+    items = _arguments call
+    compiledItems = uniformCollectionCompile ctx, call, items, hashsetType
+    assignCompile ctx, call, (irSet compiledItems)

 # Before assign the correct type to plus
 # ms['+'] = ms_plus = (ctx, call) ->
@@ -1676,7 +1706,7 @@
         translation: symbol
         pattern: literalPattern ctx, symbol
       when 'string'
-        type: toConstrained typeConstant 'String'
+        type: toConstrained stringType
         translation: symbol
         pattern: literalPattern ctx, symbol
       else
@@ -1832,6 +1862,9 @@

 token_ = (string) ->
   (tokenize string)[0]
+
+string_ = (string) ->
+  "\"#{string}\""

 translateIr = (ctx, irAst) ->
   walkIr irAst, (ast) ->
@@ -1962,6 +1995,21 @@
       params: map validIdentifier, params
       body: translateIr ctx, body)])

+
+irMap = (keys, elems) ->
+  {ir: irMapTranslate, keys, elems}
+
+irMapTranslate = (ctx, {keys, elems}) ->
+  (jsCall "Immutable.Map", [(jsArray (map jsArray, (zip keys, elems)))])
+
+
+irSet = (items) ->
+  {ir: irSetTranslate, items}
+
+irSetTranslate = (ctx, {items}) ->
+  (jsCall "Immutable.Set", items)
+
+
 isTypeConstraint = (expression) ->
   (isCall expression) and (':' is _symbol _operator expression)

@@ -2048,6 +2096,13 @@
     filter _is, map _snd, pairs
   ]

+zip = (list1, list2) ->
+  zipWith ((a, b) -> [a, b]), list1, list2
+
+zipWith = (fn, list1, list2) ->
+  for el, i in list1
+    fn el, list2[i]
+
 replicate = (expression, newForm) ->
   newForm

@@ -2169,6 +2224,7 @@

 jsMalformedTranslate = ({message}) ->
   message
+

 jsNew = (classFun, args) ->
   {js: jsNewTranslate, classFun, args}
@@ -3164,6 +3220,9 @@
 star = '*'
 arrowType = new TypeConstr 'Fn', kindFn 2
 arrayType = new TypeConstr 'Array', kindFn 1
+hashmapType = new TypeConstr 'Map', kindFn 2
+hashsetType = new TypeConstr 'Set', kindFn 1
+stringType = typeConstant 'String'

 safePrintType = (type) ->
   try
@@ -3347,6 +3406,49 @@
 # Add library to compile for running macros
 eval library

+# Immutable.js
+immutable = """
+/**
+ *  Copyright (c) 2014-2015, Facebook, Inc.
+ *  All rights reserved.
+ *
+ *  This source code is licensed under the BSD-style license found in the
+ *  LICENSE file in the root directory of this source tree. An additional grant
+ *  of patent rights can be found in the PATENTS file in the same directory.
+ *
+ * I added &&false to amd so it doesn't use it for now
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd&&false?define(e):t.Immutable=e()}(this,function(){"use strict";function t(t,e){e&&(t.prototype=Object.create(e.prototype)),t.prototype.constructor=t}function e(t){return t.value=!1,t}function r(t){t&&(t.value=!0)}function n(){}function i(t,e){e=e||0;for(var r=Math.max(0,t.length-e),n=Array(r),i=0;r>i;i++)n[i]=t[i+e];return n}function o(t){return void 0===t.size&&(t.size=t.__iterate(s)),t.size}function u(t,e){return e>=0?+e:o(t)+ +e}function s(){return!0}function a(t,e,r){return(0===t||void 0!==r&&-r>=t)&&(void 0===e||void 0!==r&&e>=r)}function h(t,e){return c(t,e,0)}function f(t,e){return c(t,e,e)}function c(t,e,r){return void 0===t?r:0>t?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}function _(t){return y(t)?t:O(t)}function p(t){return d(t)?t:x(t)}function v(t){return m(t)?t:k(t)}function l(t){return y(t)&&!g(t)?t:A(t)}function y(t){return!(!t||!t[pn])}function d(t){return!(!t||!t[vn])}function m(t){return!(!t||!t[ln])}function g(t){return d(t)||m(t)}function w(t){return!(!t||!t[yn])}function S(t){this.next=t}function z(t,e,r,n){var i=0===t?e:1===t?r:[e,r];return n?n.value=i:n={value:i,done:!1},n}function I(){return{value:void 0,done:!0}}function b(t){return!!M(t)}function q(t){return t&&"function"==typeof t.next}function D(t){var e=M(t);return e&&e.call(t)}function M(t){var e=t&&(wn&&t[wn]||t[Sn]);return"function"==typeof e?e:void 0}function E(t){return t&&"number"==typeof t.length}function O(t){return null===t||void 0===t?T():y(t)?t.toSeq():C(t)}function x(t){return null===t||void 0===t?T().toKeyedSeq():y(t)?d(t)?t.toSeq():t.fromEntrySeq():W(t)}function k(t){return null===t||void 0===t?T():y(t)?d(t)?t.entrySeq():t.toIndexedSeq():B(t)}function A(t){return(null===t||void 0===t?T():y(t)?d(t)?t.entrySeq():t:B(t)).toSetSeq()}function j(t){this._array=t,this.size=t.length}function R(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function U(t){this._iterable=t,this.size=t.length||t.size
+}function K(t){this._iterator=t,this._iteratorCache=[]}function L(t){return!(!t||!t[In])}function T(){return bn||(bn=new j([]))}function W(t){var e=Array.isArray(t)?new j(t).fromEntrySeq():q(t)?new K(t).fromEntrySeq():b(t)?new U(t).fromEntrySeq():"object"==typeof t?new R(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function B(t){var e=J(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function C(t){var e=J(t)||"object"==typeof t&&new R(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}function J(t){return E(t)?new j(t):q(t)?new K(t):b(t)?new U(t):void 0}function P(t,e,r,n){var i=t._cache;if(i){for(var o=i.length-1,u=0;o>=u;u++){var s=i[r?o-u:u];if(e(s[1],n?s[0]:u,t)===!1)return u+1}return u}return t.__iterateUncached(e,r)}function H(t,e,r,n){var i=t._cache;if(i){var o=i.length-1,u=0;return new S(function(){var t=i[r?o-u:u];return u++>o?I():z(e,n?t[0]:u-1,t[1])})}return t.__iteratorUncached(e,r)}function N(){throw TypeError("Abstract")}function V(){}function Y(){}function Q(){}function X(t,e){return t===e||t!==t&&e!==e?!0:t&&e?("function"==typeof t.valueOf&&"function"==typeof e.valueOf&&(t=t.valueOf(),e=e.valueOf()),"function"==typeof t.equals&&"function"==typeof e.equals?t.equals(e):t===e||t!==t&&e!==e):!1}function F(t,e){return e?G(e,t,"",{"":t}):Z(t)}function G(t,e,r,n){return Array.isArray(e)?t.call(n,r,k(e).map(function(r,n){return G(t,r,n,e)})):$(e)?t.call(n,r,x(e).map(function(r,n){return G(t,r,n,e)})):e}function Z(t){return Array.isArray(t)?k(t).map(Z).toList():$(t)?x(t).map(Z).toMap():t}function $(t){return t&&(t.constructor===Object||void 0===t.constructor)}function te(t){return t>>>1&1073741824|3221225471&t}function ee(t){if(t===!1||null===t||void 0===t)return 0;if("function"==typeof t.valueOf&&(t=t.valueOf(),t===!1||null===t||void 0===t))return 0;if(t===!0)return 1;var e=typeof t;if("number"===e){var r=0|t;for(r!==t&&(r^=4294967295*t);t>4294967295;)t/=4294967295,r^=t;
+return te(r)}return"string"===e?t.length>xn?re(t):ne(t):"function"==typeof t.hashCode?t.hashCode():ie(t)}function re(t){var e=jn[t];return void 0===e&&(e=ne(t),An===kn&&(An=0,jn={}),An++,jn[t]=e),e}function ne(t){for(var e=0,r=0;t.length>r;r++)e=31*e+t.charCodeAt(r)|0;return te(e)}function ie(t){var e=Mn&&Mn.get(t);if(e)return e;if(e=t[On])return e;if(!Dn){if(e=t.propertyIsEnumerable&&t.propertyIsEnumerable[On])return e;if(e=oe(t))return e}if(Object.isExtensible&&!Object.isExtensible(t))throw Error("Non-extensible objects are not allowed as keys.");if(e=++En,1073741824&En&&(En=0),Mn)Mn.set(t,e);else if(Dn)Object.defineProperty(t,On,{enumerable:!1,configurable:!1,writable:!1,value:e});else if(t.propertyIsEnumerable&&t.propertyIsEnumerable===t.constructor.prototype.propertyIsEnumerable)t.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},t.propertyIsEnumerable[On]=e;else{if(!t.nodeType)throw Error("Unable to set a non-enumerable property on object.");t[On]=e}return e}function oe(t){if(t&&t.nodeType>0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}function ue(t,e){if(!t)throw Error(e)}function se(t){ue(1/0!==t,"Cannot perform this action with an infinite size.")}function ae(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function he(t){this._iter=t,this.size=t.size}function fe(t){this._iter=t,this.size=t.size}function ce(t){this._iter=t,this.size=t.size}function _e(t){var e=je(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.contains(e)},e.contains=function(e){return t.has(e)},e.cacheResult=Re,e.__iterateUncached=function(e,r){var n=this;return t.__iterate(function(t,r){return e(r,t,n)!==!1},r)},e.__iteratorUncached=function(e,r){if(e===gn){var n=t.__iterator(e,r);return new S(function(){var t=n.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e
+}return t})}return t.__iterator(e===mn?dn:mn,r)},e}function pe(t,e,r){var n=je(t);return n.size=t.size,n.has=function(e){return t.has(e)},n.get=function(n,i){var o=t.get(n,fn);return o===fn?i:e.call(r,o,n,t)},n.__iterateUncached=function(n,i){var o=this;return t.__iterate(function(t,i,u){return n(e.call(r,t,i,u),i,o)!==!1},i)},n.__iteratorUncached=function(n,i){var o=t.__iterator(gn,i);return new S(function(){var i=o.next();if(i.done)return i;var u=i.value,s=u[0];return z(n,s,e.call(r,u[1],s,t),i)})},n}function ve(t,e){var r=je(t);return r._iter=t,r.size=t.size,r.reverse=function(){return t},t.flip&&(r.flip=function(){var e=_e(t);return e.reverse=function(){return t.flip()},e}),r.get=function(r,n){return t.get(e?r:-1-r,n)},r.has=function(r){return t.has(e?r:-1-r)},r.contains=function(e){return t.contains(e)},r.cacheResult=Re,r.__iterate=function(e,r){var n=this;return t.__iterate(function(t,r){return e(t,r,n)},!r)},r.__iterator=function(e,r){return t.__iterator(e,!r)},r}function le(t,e,r,n){var i=je(t);return n&&(i.has=function(n){var i=t.get(n,fn);return i!==fn&&!!e.call(r,i,n,t)},i.get=function(n,i){var o=t.get(n,fn);return o!==fn&&e.call(r,o,n,t)?o:i}),i.__iterateUncached=function(i,o){var u=this,s=0;return t.__iterate(function(t,o,a){return e.call(r,t,o,a)?(s++,i(t,n?o:s-1,u)):void 0},o),s},i.__iteratorUncached=function(i,o){var u=t.__iterator(gn,o),s=0;return new S(function(){for(;;){var o=u.next();if(o.done)return o;var a=o.value,h=a[0],f=a[1];if(e.call(r,f,h,t))return z(i,n?h:s++,f,o)}})},i}function ye(t,e,r){var n=Le().asMutable();return t.__iterate(function(i,o){n.update(e.call(r,i,o,t),0,function(t){return t+1})}),n.asImmutable()}function de(t,e,r){var n=d(t),i=(w(t)?Ir():Le()).asMutable();t.__iterate(function(o,u){i.update(e.call(r,o,u,t),function(t){return t=t||[],t.push(n?[u,o]:o),t})});var o=Ae(t);return i.map(function(e){return Oe(t,o(e))})}function me(t,e,r,n){var i=t.size;if(a(e,r,i))return t;var o=h(e,i),s=f(r,i);if(o!==o||s!==s)return me(t.toSeq().cacheResult(),e,r,n);var c=s-o;0>c&&(c=0);var _=je(t);
+return _.size=0===c?c:t.size&&c||void 0,!n&&L(t)&&c>=0&&(_.get=function(e,r){return e=u(this,e),e>=0&&c>e?t.get(e+o,r):r}),_.__iterateUncached=function(e,r){var i=this;if(0===c)return 0;if(r)return this.cacheResult().__iterate(e,r);var u=0,s=!0,a=0;return t.__iterate(function(t,r){return s&&(s=u++<o)?void 0:(a++,e(t,n?r:a-1,i)!==!1&&a!==c)}),a},_.__iteratorUncached=function(e,r){if(c&&r)return this.cacheResult().__iterator(e,r);var i=c&&t.__iterator(e,r),u=0,s=0;return new S(function(){for(;u++!==o;)i.next();if(++s>c)return I();var t=i.next();return n||e===mn?t:e===dn?z(e,s-1,void 0,t):z(e,s-1,t.value[1],t)})},_}function ge(t,e,r){var n=je(t);return n.__iterateUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterate(n,i);var u=0;return t.__iterate(function(t,i,s){return e.call(r,t,i,s)&&++u&&n(t,i,o)}),u},n.__iteratorUncached=function(n,i){var o=this;if(i)return this.cacheResult().__iterator(n,i);var u=t.__iterator(gn,i),s=!0;return new S(function(){if(!s)return I();var t=u.next();if(t.done)return t;var i=t.value,a=i[0],h=i[1];return e.call(r,h,a,o)?n===gn?t:z(n,a,h,t):(s=!1,I())})},n}function we(t,e,r,n){var i=je(t);return i.__iterateUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterate(i,o);var s=!0,a=0;return t.__iterate(function(t,o,h){return s&&(s=e.call(r,t,o,h))?void 0:(a++,i(t,n?o:a-1,u))}),a},i.__iteratorUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterator(i,o);var s=t.__iterator(gn,o),a=!0,h=0;return new S(function(){var t,o,f;do{if(t=s.next(),t.done)return n||i===mn?t:i===dn?z(i,h++,void 0,t):z(i,h++,t.value[1],t);var c=t.value;o=c[0],f=c[1],a&&(a=e.call(r,f,o,u))}while(a);return i===gn?t:z(i,o,f,t)})},i}function Se(t,e){var r=d(t),n=[t].concat(e).map(function(t){return y(t)?r&&(t=p(t)):t=r?W(t):B(Array.isArray(t)?t:[t]),t}).filter(function(t){return 0!==t.size});if(0===n.length)return t;if(1===n.length){var i=n[0];if(i===t||r&&d(i)||m(t)&&m(i))return i}var o=new j(n);return r?o=o.toKeyedSeq():m(t)||(o=o.toSetSeq()),o=o.flatten(!0),o.size=n.reduce(function(t,e){if(void 0!==t){var r=e.size;
+if(void 0!==r)return t+r}},0),o}function ze(t,e,r){var n=je(t);return n.__iterateUncached=function(n,i){function o(t,a){var h=this;t.__iterate(function(t,i){return(!e||e>a)&&y(t)?o(t,a+1):n(t,r?i:u++,h)===!1&&(s=!0),!s},i)}var u=0,s=!1;return o(t,0),u},n.__iteratorUncached=function(n,i){var o=t.__iterator(n,i),u=[],s=0;return new S(function(){for(;o;){var t=o.next();if(t.done===!1){var a=t.value;if(n===gn&&(a=a[1]),e&&!(e>u.length)||!y(a))return r?t:z(n,s++,a,t);u.push(o),o=a.__iterator(n,i)}else o=u.pop()}return I()})},n}function Ie(t,e,r){var n=Ae(t);return t.toSeq().map(function(i,o){return n(e.call(r,i,o,t))}).flatten(!0)}function be(t,e){var r=je(t);return r.size=t.size&&2*t.size-1,r.__iterateUncached=function(r,n){var i=this,o=0;return t.__iterate(function(t){return(!o||r(e,o++,i)!==!1)&&r(t,o++,i)!==!1},n),o},r.__iteratorUncached=function(r,n){var i,o=t.__iterator(mn,n),u=0;return new S(function(){return(!i||u%2)&&(i=o.next(),i.done)?i:u%2?z(r,u++,e):z(r,u++,i.value,i)})},r}function qe(t,e,r){e||(e=Ue);var n=d(t),i=0,o=t.toSeq().map(function(e,n){return[n,e,i++,r?r(e,n,t):e]}).toArray();return o.sort(function(t,r){return e(t[3],r[3])||t[2]-r[2]}).forEach(n?function(t,e){o[e].length=2}:function(t,e){o[e]=t[1]}),n?x(o):m(t)?k(o):A(o)}function De(t,e,r){if(e||(e=Ue),r){var n=t.toSeq().map(function(e,n){return[e,r(e,n,t)]}).reduce(function(t,r){return Me(e,t[1],r[1])?r:t});return n&&n[0]}return t.reduce(function(t,r){return Me(e,t,r)?r:t})}function Me(t,e,r){var n=t(r,e);return 0===n&&r!==e&&(void 0===r||null===r||r!==r)||n>0}function Ee(t,e,r){var n=je(t);return n.size=new j(r).map(function(t){return t.size}).min(),n.__iterate=function(t,e){for(var r,n=this.__iterator(mn,e),i=0;!(r=n.next()).done&&t(r.value,i++,this)!==!1;);return i},n.__iteratorUncached=function(t,n){var i=r.map(function(t){return t=_(t),D(n?t.reverse():t)}),o=0,u=!1;return new S(function(){var r;return u||(r=i.map(function(t){return t.next()}),u=r.some(function(t){return t.done})),u?I():z(t,o++,e.apply(null,r.map(function(t){return t.value})))
+})},n}function Oe(t,e){return L(t)?e:t.constructor(e)}function xe(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function ke(t){return se(t.size),o(t)}function Ae(t){return d(t)?p:m(t)?v:l}function je(t){return Object.create((d(t)?x:m(t)?k:A).prototype)}function Re(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):O.prototype.cacheResult.call(this)}function Ue(t,e){return t>e?1:e>t?-1:0}function Ke(t){var e=D(t);if(!e){if(!E(t))throw new TypeError("Expected iterable or array-like: "+t);e=D(_(t))}return e}function Le(t){return null===t||void 0===t?Qe():Te(t)?t:Qe().withMutations(function(e){var r=p(t);se(r.size),r.forEach(function(t,r){return e.set(r,t)})})}function Te(t){return!(!t||!t[Rn])}function We(t,e){this.ownerID=t,this.entries=e}function Be(t,e,r){this.ownerID=t,this.bitmap=e,this.nodes=r}function Ce(t,e,r){this.ownerID=t,this.count=e,this.nodes=r}function Je(t,e,r){this.ownerID=t,this.keyHash=e,this.entries=r}function Pe(t,e,r){this.ownerID=t,this.keyHash=e,this.entry=r}function He(t,e,r){this._type=e,this._reverse=r,this._stack=t._root&&Ve(t._root)}function Ne(t,e){return z(t,e[0],e[1])}function Ve(t,e){return{node:t,index:0,__prev:e}}function Ye(t,e,r,n){var i=Object.create(Un);return i.size=t,i._root=e,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function Qe(){return Kn||(Kn=Ye(0))}function Xe(t,r,n){var i,o;if(t._root){var u=e(cn),s=e(_n);if(i=Fe(t._root,t.__ownerID,0,void 0,r,n,u,s),!s.value)return t;o=t.size+(u.value?n===fn?-1:1:0)}else{if(n===fn)return t;o=1,i=new We(t.__ownerID,[[r,n]])}return t.__ownerID?(t.size=o,t._root=i,t.__hash=void 0,t.__altered=!0,t):i?Ye(o,i):Qe()}function Fe(t,e,n,i,o,u,s,a){return t?t.update(e,n,i,o,u,s,a):u===fn?t:(r(a),r(s),new Pe(e,i,[o,u]))}function Ge(t){return t.constructor===Pe||t.constructor===Je}function Ze(t,e,r,n,i){if(t.keyHash===n)return new Je(e,n,[t.entry,i]);var o,u=(0===r?t.keyHash:t.keyHash>>>r)&hn,s=(0===r?n:n>>>r)&hn,a=u===s?[Ze(t,e,r+sn,n,i)]:(o=new Pe(e,n,i),s>u?[t,o]:[o,t]);return new Be(e,1<<u|1<<s,a)
+}function $e(t,e,r,i){t||(t=new n);for(var o=new Pe(t,ee(r),[r,i]),u=0;e.length>u;u++){var s=e[u];o=o.update(t,0,void 0,s[0],s[1])}return o}function tr(t,e,r,n){for(var i=0,o=0,u=Array(r),s=0,a=1,h=e.length;h>s;s++,a<<=1){var f=e[s];void 0!==f&&s!==n&&(i|=a,u[o++]=f)}return new Be(t,i,u)}function er(t,e,r,n,i){for(var o=0,u=Array(an),s=0;0!==r;s++,r>>>=1)u[s]=1&r?e[o++]:void 0;return u[n]=i,new Ce(t,o+1,u)}function rr(t,e,r){for(var n=[],i=0;r.length>i;i++){var o=r[i],u=p(o);y(o)||(u=u.map(function(t){return F(t)})),n.push(u)}return ir(t,e,n)}function nr(t){return function(e,r){return e&&e.mergeDeepWith&&y(r)?e.mergeDeepWith(t,r):t?t(e,r):r}}function ir(t,e,r){return r=r.filter(function(t){return 0!==t.size}),0===r.length?t:0===t.size&&1===r.length?t.constructor(r[0]):t.withMutations(function(t){for(var n=e?function(r,n){t.update(n,fn,function(t){return t===fn?r:e(t,r)})}:function(e,r){t.set(r,e)},i=0;r.length>i;i++)r[i].forEach(n)})}function or(t,e,r,n){var i=t===fn,o=e.next();if(o.done){var u=i?r:t,s=n(u);return s===u?t:s}ue(i||t&&t.set,"invalid keyPath");var a=o.value,h=i?fn:t.get(a,fn),f=or(h,e,r,n);return f===h?t:f===fn?t.remove(a):(i?Qe():t).set(a,f)}function ur(t){return t-=t>>1&1431655765,t=(858993459&t)+(t>>2&858993459),t=t+(t>>4)&252645135,t+=t>>8,t+=t>>16,127&t}function sr(t,e,r,n){var o=n?t:i(t);return o[e]=r,o}function ar(t,e,r,n){var i=t.length+1;if(n&&e+1===i)return t[e]=r,t;for(var o=Array(i),u=0,s=0;i>s;s++)s===e?(o[s]=r,u=-1):o[s]=t[s+u];return o}function hr(t,e,r){var n=t.length-1;if(r&&e===n)return t.pop(),t;for(var i=Array(n),o=0,u=0;n>u;u++)u===e&&(o=1),i[u]=t[u+o];return i}function fr(t){var e=lr();if(null===t||void 0===t)return e;if(cr(t))return t;var r=v(t),n=r.size;return 0===n?e:(se(n),n>0&&an>n?vr(0,n,sn,null,new _r(r.toArray())):e.withMutations(function(t){t.setSize(n),r.forEach(function(e,r){return t.set(r,e)})}))}function cr(t){return!(!t||!t[Bn])}function _r(t,e){this.array=t,this.ownerID=e}function pr(t,e){function r(t,e,r){return 0===e?n(t,r):i(t,e,r)}function n(t,r){var n=r===s?a&&a.array:t&&t.array,i=r>o?0:o-r,h=u-r;
+return h>an&&(h=an),function(){if(i===h)return Pn;var t=e?--h:i++;return n&&n[t]}}function i(t,n,i){var s,a=t&&t.array,h=i>o?0:o-i>>n,f=(u-i>>n)+1;return f>an&&(f=an),function(){for(;;){if(s){var t=s();if(t!==Pn)return t;s=null}if(h===f)return Pn;var o=e?--f:h++;s=r(a&&a[o],n-sn,i+(o<<n))}}}var o=t._origin,u=t._capacity,s=zr(u),a=t._tail;return r(t._root,t._level,0)}function vr(t,e,r,n,i,o,u){var s=Object.create(Cn);return s.size=e-t,s._origin=t,s._capacity=e,s._level=r,s._root=n,s._tail=i,s.__ownerID=o,s.__hash=u,s.__altered=!1,s}function lr(){return Jn||(Jn=vr(0,0,sn))}function yr(t,r,n){if(r=u(t,r),r>=t.size||0>r)return t.withMutations(function(t){0>r?wr(t,r).set(0,n):wr(t,0,r+1).set(r,n)});r+=t._origin;var i=t._tail,o=t._root,s=e(_n);return r>=zr(t._capacity)?i=dr(i,t.__ownerID,0,r,n,s):o=dr(o,t.__ownerID,t._level,r,n,s),s.value?t.__ownerID?(t._root=o,t._tail=i,t.__hash=void 0,t.__altered=!0,t):vr(t._origin,t._capacity,t._level,o,i):t}function dr(t,e,n,i,o,u){var s=i>>>n&hn,a=t&&t.array.length>s;if(!a&&void 0===o)return t;var h;if(n>0){var f=t&&t.array[s],c=dr(f,e,n-sn,i,o,u);return c===f?t:(h=mr(t,e),h.array[s]=c,h)}return a&&t.array[s]===o?t:(r(u),h=mr(t,e),void 0===o&&s===h.array.length-1?h.array.pop():h.array[s]=o,h)}function mr(t,e){return e&&t&&e===t.ownerID?t:new _r(t?t.array.slice():[],e)}function gr(t,e){if(e>=zr(t._capacity))return t._tail;if(1<<t._level+sn>e){for(var r=t._root,n=t._level;r&&n>0;)r=r.array[e>>>n&hn],n-=sn;return r}}function wr(t,e,r){var i=t.__ownerID||new n,o=t._origin,u=t._capacity,s=o+e,a=void 0===r?u:0>r?u+r:o+r;if(s===o&&a===u)return t;if(s>=a)return t.clear();for(var h=t._level,f=t._root,c=0;0>s+c;)f=new _r(f&&f.array.length?[void 0,f]:[],i),h+=sn,c+=1<<h;c&&(s+=c,o+=c,a+=c,u+=c);for(var _=zr(u),p=zr(a);p>=1<<h+sn;)f=new _r(f&&f.array.length?[f]:[],i),h+=sn;var v=t._tail,l=_>p?gr(t,a-1):p>_?new _r([],i):v;if(v&&p>_&&u>s&&v.array.length){f=mr(f,i);for(var y=f,d=h;d>sn;d-=sn){var m=_>>>d&hn;y=y.array[m]=mr(y.array[m],i)}y.array[_>>>sn&hn]=v}if(u>a&&(l=l&&l.removeAfter(i,0,a)),s>=p)s-=p,a-=p,h=sn,f=null,l=l&&l.removeBefore(i,0,s);
+else if(s>o||_>p){for(c=0;f;){var g=s>>>h&hn;if(g!==p>>>h&hn)break;g&&(c+=(1<<h)*g),h-=sn,f=f.array[g]}f&&s>o&&(f=f.removeBefore(i,h,s-c)),f&&_>p&&(f=f.removeAfter(i,h,p-c)),c&&(s-=c,a-=c)}return t.__ownerID?(t.size=a-s,t._origin=s,t._capacity=a,t._level=h,t._root=f,t._tail=l,t.__hash=void 0,t.__altered=!0,t):vr(s,a,h,f,l)}function Sr(t,e,r){for(var n=[],i=0,o=0;r.length>o;o++){var u=r[o],s=v(u);s.size>i&&(i=s.size),y(u)||(s=s.map(function(t){return F(t)})),n.push(s)}return i>t.size&&(t=t.setSize(i)),ir(t,e,n)}function zr(t){return an>t?0:t-1>>>sn<<sn}function Ir(t){return null===t||void 0===t?Dr():br(t)?t:Dr().withMutations(function(e){var r=p(t);se(r.size),r.forEach(function(t,r){return e.set(r,t)})})}function br(t){return Te(t)&&w(t)}function qr(t,e,r,n){var i=Object.create(Ir.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=r,i.__hash=n,i}function Dr(){return Hn||(Hn=qr(Qe(),lr()))}function Mr(t,e,r){var n,i,o=t._map,u=t._list,s=o.get(e),a=void 0!==s;if(r===fn){if(!a)return t;u.size>=an&&u.size>=2*o.size?(i=u.filter(function(t,e){return void 0!==t&&s!==e}),n=i.toKeyedSeq().map(function(t){return t[0]}).flip().toMap(),t.__ownerID&&(n.__ownerID=i.__ownerID=t.__ownerID)):(n=o.remove(e),i=s===u.size-1?u.pop():u.set(s,void 0))}else if(a){if(r===u.get(s)[1])return t;n=o,i=u.set(s,[e,r])}else n=o.set(e,u.size),i=u.set(u.size,[e,r]);return t.__ownerID?(t.size=n.size,t._map=n,t._list=i,t.__hash=void 0,t):qr(n,i)}function Er(t){return null===t||void 0===t?kr():Or(t)?t:kr().unshiftAll(t)}function Or(t){return!(!t||!t[Nn])}function xr(t,e,r,n){var i=Object.create(Vn);return i.size=t,i._head=e,i.__ownerID=r,i.__hash=n,i.__altered=!1,i}function kr(){return Yn||(Yn=xr(0))}function Ar(t){return null===t||void 0===t?Kr():jr(t)?t:Kr().withMutations(function(e){var r=l(t);se(r.size),r.forEach(function(t){return e.add(t)})})}function jr(t){return!(!t||!t[Qn])}function Rr(t,e){return t.__ownerID?(t.size=e.size,t._map=e,t):e===t._map?t:0===e.size?t.__empty():t.__make(e)}function Ur(t,e){var r=Object.create(Xn);return r.size=t?t.size:0,r._map=t,r.__ownerID=e,r
+}function Kr(){return Fn||(Fn=Ur(Qe()))}function Lr(t){return null===t||void 0===t?Br():Tr(t)?t:Br().withMutations(function(e){var r=l(t);se(r.size),r.forEach(function(t){return e.add(t)})})}function Tr(t){return jr(t)&&w(t)}function Wr(t,e){var r=Object.create(Gn);return r.size=t?t.size:0,r._map=t,r.__ownerID=e,r}function Br(){return Zn||(Zn=Wr(Dr()))}function Cr(t,e){var r=function(t){return this instanceof r?void(this._map=Le(t)):new r(t)},n=Object.keys(t),i=r.prototype=Object.create($n);i.constructor=r,e&&(i._name=e),i._defaultValues=t,i._keys=n,i.size=n.length;try{n.forEach(function(t){Object.defineProperty(r.prototype,t,{get:function(){return this.get(t)},set:function(e){ue(this.__ownerID,"Cannot set on an immutable record."),this.set(t,e)}})})}catch(o){}return r}function Jr(t,e,r){var n=Object.create(Object.getPrototypeOf(t));return n._map=e,n.__ownerID=r,n}function Pr(t){return t._name||t.constructor.name}function Hr(t,e){if(t===e)return!0;if(!y(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||d(t)!==d(e)||m(t)!==m(e)||w(t)!==w(e))return!1;if(0===t.size&&0===e.size)return!0;var r=!g(t);if(w(t)){var n=t.entries();return e.every(function(t,e){var i=n.next().value;return i&&X(i[1],t)&&(r||X(i[0],e))})&&n.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)t.cacheResult();else{i=!0;var o=t;t=e,e=o}var u=!0,s=e.__iterate(function(e,n){return(r?t.has(e):i?X(e,t.get(n,fn)):X(t.get(n,fn),e))?void 0:(u=!1,!1)});return u&&t.size===s}function Nr(t,e,r){if(!(this instanceof Nr))return new Nr(t,e,r);if(ue(0!==r,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),r=void 0===r?1:Math.abs(r),t>e&&(r=-r),this._start=t,this._end=e,this._step=r,this.size=Math.max(0,Math.ceil((e-t)/r-1)+1),0===this.size){if(ti)return ti;ti=this}}function Vr(t,e){if(!(this instanceof Vr))return new Vr(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(ei)return ei;ei=this}}function Yr(t,e){var r=function(r){t.prototype[r]=e[r]};return Object.keys(e).forEach(r),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(e).forEach(r),t
+}function Qr(t,e){return e}function Xr(t,e){return[e,t]}function Fr(t){return function(){return!t.apply(this,arguments)}}function Gr(t){return function(){return-t.apply(this,arguments)}}function Zr(t){return"string"==typeof t?JSON.stringify(t):t}function $r(){return i(arguments)}function tn(t,e){return e>t?1:t>e?-1:0}function en(t){if(1/0===t.size)return 0;var e=w(t),r=d(t),n=e?1:0,i=t.__iterate(r?e?function(t,e){n=31*n+nn(ee(t),ee(e))|0}:function(t,e){n=n+nn(ee(t),ee(e))|0}:e?function(t){n=31*n+ee(t)|0}:function(t){n=n+ee(t)|0});return rn(i,n)}function rn(t,e){return e=qn(e,3432918353),e=qn(e<<15|e>>>-15,461845907),e=qn(e<<13|e>>>-13,5),e=(e+3864292196|0)^t,e=qn(e^e>>>16,2246822507),e=qn(e^e>>>13,3266489909),e=te(e^e>>>16)}function nn(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}var on=Array.prototype.slice,un="delete",sn=5,an=1<<sn,hn=an-1,fn={},cn={value:!1},_n={value:!1};t(p,_),t(v,_),t(l,_),_.isIterable=y,_.isKeyed=d,_.isIndexed=m,_.isAssociative=g,_.isOrdered=w,_.Keyed=p,_.Indexed=v,_.Set=l;var pn="@@__IMMUTABLE_ITERABLE__@@",vn="@@__IMMUTABLE_KEYED__@@",ln="@@__IMMUTABLE_INDEXED__@@",yn="@@__IMMUTABLE_ORDERED__@@",dn=0,mn=1,gn=2,wn="function"==typeof Symbol&&Symbol.iterator,Sn="@@iterator",zn=wn||Sn;S.prototype.toString=function(){return"[Iterator]"},S.KEYS=dn,S.VALUES=mn,S.ENTRIES=gn,S.prototype.inspect=S.prototype.toSource=function(){return""+this},S.prototype[zn]=function(){return this},t(O,_),O.of=function(){return O(arguments)},O.prototype.toSeq=function(){return this},O.prototype.toString=function(){return this.__toString("Seq {","}")},O.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},O.prototype.__iterate=function(t,e){return P(this,t,e,!0)},O.prototype.__iterator=function(t,e){return H(this,t,e,!0)},t(x,O),x.prototype.toKeyedSeq=function(){return this},t(k,O),k.of=function(){return k(arguments)},k.prototype.toIndexedSeq=function(){return this},k.prototype.toString=function(){return this.__toString("Seq [","]")
+},k.prototype.__iterate=function(t,e){return P(this,t,e,!1)},k.prototype.__iterator=function(t,e){return H(this,t,e,!1)},t(A,O),A.of=function(){return A(arguments)},A.prototype.toSetSeq=function(){return this},O.isSeq=L,O.Keyed=x,O.Set=A,O.Indexed=k;var In="@@__IMMUTABLE_SEQ__@@";O.prototype[In]=!0,t(j,k),j.prototype.get=function(t,e){return this.has(t)?this._array[u(this,t)]:e},j.prototype.__iterate=function(t,e){for(var r=this._array,n=r.length-1,i=0;n>=i;i++)if(t(r[e?n-i:i],i,this)===!1)return i+1;return i},j.prototype.__iterator=function(t,e){var r=this._array,n=r.length-1,i=0;return new S(function(){return i>n?I():z(t,i,r[e?n-i++:i++])})},t(R,x),R.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},R.prototype.has=function(t){return this._object.hasOwnProperty(t)},R.prototype.__iterate=function(t,e){for(var r=this._object,n=this._keys,i=n.length-1,o=0;i>=o;o++){var u=n[e?i-o:o];if(t(r[u],u,this)===!1)return o+1}return o},R.prototype.__iterator=function(t,e){var r=this._object,n=this._keys,i=n.length-1,o=0;return new S(function(){var u=n[e?i-o:o];return o++>i?I():z(t,u,r[u])})},R.prototype[yn]=!0,t(U,k),U.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);var r=this._iterable,n=D(r),i=0;if(q(n))for(var o;!(o=n.next()).done&&t(o.value,i++,this)!==!1;);return i},U.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var r=this._iterable,n=D(r);if(!q(n))return new S(I);var i=0;return new S(function(){var e=n.next();return e.done?e:z(t,i++,e.value)})},t(K,k),K.prototype.__iterateUncached=function(t,e){if(e)return this.cacheResult().__iterate(t,e);for(var r=this._iterator,n=this._iteratorCache,i=0;n.length>i;)if(t(n[i],i++,this)===!1)return i;for(var o;!(o=r.next()).done;){var u=o.value;if(n[i]=u,t(u,i++,this)===!1)break}return i},K.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var r=this._iterator,n=this._iteratorCache,i=0;return new S(function(){if(i>=n.length){var e=r.next();
+if(e.done)return e;n[i]=e.value}return z(t,i,n[i++])})};var bn;t(N,_),t(V,N),t(Y,N),t(Q,N),N.Keyed=V,N.Indexed=Y,N.Set=Q;var qn="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(t,e){t=0|t,e=0|e;var r=65535&t,n=65535&e;return r*n+((t>>>16)*n+r*(e>>>16)<<16>>>0)|0},Dn=function(){try{return Object.defineProperty({},"@",{}),!0}catch(t){return!1}}(),Mn="function"==typeof WeakMap&&new WeakMap,En=0,On="__immutablehash__";"function"==typeof Symbol&&(On=Symbol(On));var xn=16,kn=255,An=0,jn={};t(ae,x),ae.prototype.get=function(t,e){return this._iter.get(t,e)},ae.prototype.has=function(t){return this._iter.has(t)},ae.prototype.valueSeq=function(){return this._iter.valueSeq()},ae.prototype.reverse=function(){var t=this,e=ve(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},ae.prototype.map=function(t,e){var r=this,n=pe(this,t,e);return this._useKeys||(n.valueSeq=function(){return r._iter.toSeq().map(t,e)}),n},ae.prototype.__iterate=function(t,e){var r,n=this;return this._iter.__iterate(this._useKeys?function(e,r){return t(e,r,n)}:(r=e?ke(this):0,function(i){return t(i,e?--r:r++,n)}),e)},ae.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var r=this._iter.__iterator(mn,e),n=e?ke(this):0;return new S(function(){var i=r.next();return i.done?i:z(t,e?--n:n++,i.value,i)})},ae.prototype[yn]=!0,t(he,k),he.prototype.contains=function(t){return this._iter.contains(t)},he.prototype.__iterate=function(t,e){var r=this,n=0;return this._iter.__iterate(function(e){return t(e,n++,r)},e)},he.prototype.__iterator=function(t,e){var r=this._iter.__iterator(mn,e),n=0;return new S(function(){var e=r.next();return e.done?e:z(t,n++,e.value,e)})},t(fe,A),fe.prototype.has=function(t){return this._iter.contains(t)},fe.prototype.__iterate=function(t,e){var r=this;return this._iter.__iterate(function(e){return t(e,e,r)},e)},fe.prototype.__iterator=function(t,e){var r=this._iter.__iterator(mn,e);return new S(function(){var e=r.next();return e.done?e:z(t,e.value,e.value,e)
+})},t(ce,x),ce.prototype.entrySeq=function(){return this._iter.toSeq()},ce.prototype.__iterate=function(t,e){var r=this;return this._iter.__iterate(function(e){return e?(xe(e),t(e[1],e[0],r)):void 0},e)},ce.prototype.__iterator=function(t,e){var r=this._iter.__iterator(mn,e);return new S(function(){for(;;){var e=r.next();if(e.done)return e;var n=e.value;if(n)return xe(n),t===gn?e:z(t,n[0],n[1],e)}})},he.prototype.cacheResult=ae.prototype.cacheResult=fe.prototype.cacheResult=ce.prototype.cacheResult=Re,t(Le,V),Le.prototype.toString=function(){return this.__toString("Map {","}")},Le.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},Le.prototype.set=function(t,e){return Xe(this,t,e)},Le.prototype.setIn=function(t,e){return this.updateIn(t,fn,function(){return e})},Le.prototype.remove=function(t){return Xe(this,t,fn)},Le.prototype.deleteIn=function(t){return this.updateIn(t,function(){return fn})},Le.prototype.update=function(t,e,r){return 1===arguments.length?t(this):this.updateIn([t],e,r)},Le.prototype.updateIn=function(t,e,r){r||(r=e,e=void 0);var n=or(this,Ke(t),e,r);return n===fn?void 0:n},Le.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Qe()},Le.prototype.merge=function(){return rr(this,void 0,arguments)},Le.prototype.mergeWith=function(t){var e=on.call(arguments,1);return rr(this,t,e)},Le.prototype.mergeIn=function(t){var e=on.call(arguments,1);return this.updateIn(t,Qe(),function(t){return t.merge.apply(t,e)})},Le.prototype.mergeDeep=function(){return rr(this,nr(void 0),arguments)},Le.prototype.mergeDeepWith=function(t){var e=on.call(arguments,1);return rr(this,nr(t),e)},Le.prototype.mergeDeepIn=function(t){var e=on.call(arguments,1);return this.updateIn(t,Qe(),function(t){return t.mergeDeep.apply(t,e)})},Le.prototype.sort=function(t){return Ir(qe(this,t))},Le.prototype.sortBy=function(t,e){return Ir(qe(this,e,t))},Le.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this
+},Le.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new n)},Le.prototype.asImmutable=function(){return this.__ensureOwner()},Le.prototype.wasAltered=function(){return this.__altered},Le.prototype.__iterator=function(t,e){return new He(this,t,e)},Le.prototype.__iterate=function(t,e){var r=this,n=0;return this._root&&this._root.iterate(function(e){return n++,t(e[1],e[0],r)},e),n},Le.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Ye(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Le.isMap=Te;var Rn="@@__IMMUTABLE_MAP__@@",Un=Le.prototype;Un[Rn]=!0,Un[un]=Un.remove,Un.removeIn=Un.deleteIn,We.prototype.get=function(t,e,r,n){for(var i=this.entries,o=0,u=i.length;u>o;o++)if(X(r,i[o][0]))return i[o][1];return n},We.prototype.update=function(t,e,n,o,u,s,a){for(var h=u===fn,f=this.entries,c=0,_=f.length;_>c&&!X(o,f[c][0]);c++);var p=_>c;if(p?f[c][1]===u:h)return this;if(r(a),(h||!p)&&r(s),!h||1!==f.length){if(!p&&!h&&f.length>=Ln)return $e(t,f,o,u);var v=t&&t===this.ownerID,l=v?f:i(f);return p?h?c===_-1?l.pop():l[c]=l.pop():l[c]=[o,u]:l.push([o,u]),v?(this.entries=l,this):new We(t,l)}},Be.prototype.get=function(t,e,r,n){void 0===e&&(e=ee(r));var i=1<<((0===t?e:e>>>t)&hn),o=this.bitmap;return 0===(o&i)?n:this.nodes[ur(o&i-1)].get(t+sn,e,r,n)},Be.prototype.update=function(t,e,r,n,i,o,u){void 0===r&&(r=ee(n));var s=(0===e?r:r>>>e)&hn,a=1<<s,h=this.bitmap,f=0!==(h&a);if(!f&&i===fn)return this;var c=ur(h&a-1),_=this.nodes,p=f?_[c]:void 0,v=Fe(p,t,e+sn,r,n,i,o,u);if(v===p)return this;if(!f&&v&&_.length>=Tn)return er(t,_,h,s,v);if(f&&!v&&2===_.length&&Ge(_[1^c]))return _[1^c];if(f&&v&&1===_.length&&Ge(v))return v;var l=t&&t===this.ownerID,y=f?v?h:h^a:h|a,d=f?v?sr(_,c,v,l):hr(_,c,l):ar(_,c,v,l);return l?(this.bitmap=y,this.nodes=d,this):new Be(t,y,d)},Ce.prototype.get=function(t,e,r,n){void 0===e&&(e=ee(r));var i=(0===t?e:e>>>t)&hn,o=this.nodes[i];return o?o.get(t+sn,e,r,n):n},Ce.prototype.update=function(t,e,r,n,i,o,u){void 0===r&&(r=ee(n));var s=(0===e?r:r>>>e)&hn,a=i===fn,h=this.nodes,f=h[s];
+if(a&&!f)return this;var c=Fe(f,t,e+sn,r,n,i,o,u);if(c===f)return this;var _=this.count;if(f){if(!c&&(_--,Wn>_))return tr(t,h,_,s)}else _++;var p=t&&t===this.ownerID,v=sr(h,s,c,p);return p?(this.count=_,this.nodes=v,this):new Ce(t,_,v)},Je.prototype.get=function(t,e,r,n){for(var i=this.entries,o=0,u=i.length;u>o;o++)if(X(r,i[o][0]))return i[o][1];return n},Je.prototype.update=function(t,e,n,o,u,s,a){void 0===n&&(n=ee(o));var h=u===fn;if(n!==this.keyHash)return h?this:(r(a),r(s),Ze(this,t,e,n,[o,u]));for(var f=this.entries,c=0,_=f.length;_>c&&!X(o,f[c][0]);c++);var p=_>c;if(p?f[c][1]===u:h)return this;if(r(a),(h||!p)&&r(s),h&&2===_)return new Pe(t,this.keyHash,f[1^c]);var v=t&&t===this.ownerID,l=v?f:i(f);return p?h?c===_-1?l.pop():l[c]=l.pop():l[c]=[o,u]:l.push([o,u]),v?(this.entries=l,this):new Je(t,this.keyHash,l)},Pe.prototype.get=function(t,e,r,n){return X(r,this.entry[0])?this.entry[1]:n},Pe.prototype.update=function(t,e,n,i,o,u,s){var a=o===fn,h=X(i,this.entry[0]);return(h?o===this.entry[1]:a)?this:(r(s),a?void r(u):h?t&&t===this.ownerID?(this.entry[1]=o,this):new Pe(t,this.keyHash,[i,o]):(r(u),Ze(this,t,e,ee(i),[i,o])))},We.prototype.iterate=Je.prototype.iterate=function(t,e){for(var r=this.entries,n=0,i=r.length-1;i>=n;n++)if(t(r[e?i-n:n])===!1)return!1},Be.prototype.iterate=Ce.prototype.iterate=function(t,e){for(var r=this.nodes,n=0,i=r.length-1;i>=n;n++){var o=r[e?i-n:n];if(o&&o.iterate(t,e)===!1)return!1}},Pe.prototype.iterate=function(t){return t(this.entry)},t(He,S),He.prototype.next=function(){for(var t=this._type,e=this._stack;e;){var r,n=e.node,i=e.index++;if(n.entry){if(0===i)return Ne(t,n.entry)}else if(n.entries){if(r=n.entries.length-1,r>=i)return Ne(t,n.entries[this._reverse?r-i:i])}else if(r=n.nodes.length-1,r>=i){var o=n.nodes[this._reverse?r-i:i];if(o){if(o.entry)return Ne(t,o.entry);e=this._stack=Ve(o,e)}continue}e=this._stack=this._stack.__prev}return I()};var Kn,Ln=an/4,Tn=an/2,Wn=an/4;t(fr,Y),fr.of=function(){return this(arguments)},fr.prototype.toString=function(){return this.__toString("List [","]")
+},fr.prototype.get=function(t,e){if(t=u(this,t),0>t||t>=this.size)return e;t+=this._origin;var r=gr(this,t);return r&&r.array[t&hn]},fr.prototype.set=function(t,e){return yr(this,t,e)},fr.prototype.remove=function(t){return this.has(t)?0===t?this.shift():t===this.size-1?this.pop():this.splice(t,1):this},fr.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=sn,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):lr()},fr.prototype.push=function(){var t=arguments,e=this.size;return this.withMutations(function(r){wr(r,0,e+t.length);for(var n=0;t.length>n;n++)r.set(e+n,t[n])})},fr.prototype.pop=function(){return wr(this,0,-1)},fr.prototype.unshift=function(){var t=arguments;return this.withMutations(function(e){wr(e,-t.length);for(var r=0;t.length>r;r++)e.set(r,t[r])})},fr.prototype.shift=function(){return wr(this,1)},fr.prototype.merge=function(){return Sr(this,void 0,arguments)},fr.prototype.mergeWith=function(t){var e=on.call(arguments,1);return Sr(this,t,e)},fr.prototype.mergeDeep=function(){return Sr(this,nr(void 0),arguments)},fr.prototype.mergeDeepWith=function(t){var e=on.call(arguments,1);return Sr(this,nr(t),e)},fr.prototype.setSize=function(t){return wr(this,0,t)},fr.prototype.slice=function(t,e){var r=this.size;return a(t,e,r)?this:wr(this,h(t,r),f(e,r))},fr.prototype.__iterator=function(t,e){var r=0,n=pr(this,e);return new S(function(){var e=n();return e===Pn?I():z(t,r++,e)})},fr.prototype.__iterate=function(t,e){for(var r,n=0,i=pr(this,e);(r=i())!==Pn&&t(r,n++,this)!==!1;);return n},fr.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?vr(this._origin,this._capacity,this._level,this._root,this._tail,t,this.__hash):(this.__ownerID=t,this)},fr.isList=cr;var Bn="@@__IMMUTABLE_LIST__@@",Cn=fr.prototype;Cn[Bn]=!0,Cn[un]=Cn.remove,Cn.setIn=Un.setIn,Cn.deleteIn=Cn.removeIn=Un.removeIn,Cn.update=Un.update,Cn.updateIn=Un.updateIn,Cn.mergeIn=Un.mergeIn,Cn.mergeDeepIn=Un.mergeDeepIn,Cn.withMutations=Un.withMutations,Cn.asMutable=Un.asMutable,Cn.asImmutable=Un.asImmutable,Cn.wasAltered=Un.wasAltered,_r.prototype.removeBefore=function(t,e,r){if(r===e?1<<e:0||0===this.array.length)return this;
+var n=r>>>e&hn;if(n>=this.array.length)return new _r([],t);var i,o=0===n;if(e>0){var u=this.array[n];if(i=u&&u.removeBefore(t,e-sn,r),i===u&&o)return this}if(o&&!i)return this;var s=mr(this,t);if(!o)for(var a=0;n>a;a++)s.array[a]=void 0;return i&&(s.array[n]=i),s},_r.prototype.removeAfter=function(t,e,r){if(r===e?1<<e:0||0===this.array.length)return this;var n=r-1>>>e&hn;if(n>=this.array.length)return this;var i,o=n===this.array.length-1;if(e>0){var u=this.array[n];if(i=u&&u.removeAfter(t,e-sn,r),i===u&&o)return this}if(o&&!i)return this;var s=mr(this,t);return o||s.array.pop(),i&&(s.array[n]=i),s};var Jn,Pn={};t(Ir,Le),Ir.of=function(){return this(arguments)},Ir.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Ir.prototype.get=function(t,e){var r=this._map.get(t);return void 0!==r?this._list.get(r)[1]:e},Ir.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Dr()},Ir.prototype.set=function(t,e){return Mr(this,t,e)},Ir.prototype.remove=function(t){return Mr(this,t,fn)},Ir.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Ir.prototype.__iterate=function(t,e){var r=this;return this._list.__iterate(function(e){return e&&t(e[1],e[0],r)},e)},Ir.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Ir.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),r=this._list.__ensureOwner(t);return t?qr(e,r,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=r,this)},Ir.isOrderedMap=br,Ir.prototype[yn]=!0,Ir.prototype[un]=Ir.prototype.remove;var Hn;t(Er,Y),Er.of=function(){return this(arguments)},Er.prototype.toString=function(){return this.__toString("Stack [","]")},Er.prototype.get=function(t,e){for(var r=this._head;r&&t--;)r=r.next;return r?r.value:e},Er.prototype.peek=function(){return this._head&&this._head.value},Er.prototype.push=function(){if(0===arguments.length)return this;for(var t=this.size+arguments.length,e=this._head,r=arguments.length-1;r>=0;r--)e={value:arguments[r],next:e};
+return this.__ownerID?(this.size=t,this._head=e,this.__hash=void 0,this.__altered=!0,this):xr(t,e)},Er.prototype.pushAll=function(t){if(t=v(t),0===t.size)return this;se(t.size);var e=this.size,r=this._head;return t.reverse().forEach(function(t){e++,r={value:t,next:r}}),this.__ownerID?(this.size=e,this._head=r,this.__hash=void 0,this.__altered=!0,this):xr(e,r)},Er.prototype.pop=function(){return this.slice(1)},Er.prototype.unshift=function(){return this.push.apply(this,arguments)},Er.prototype.unshiftAll=function(t){return this.pushAll(t)},Er.prototype.shift=function(){return this.pop.apply(this,arguments)},Er.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):kr()},Er.prototype.slice=function(t,e){if(a(t,e,this.size))return this;var r=h(t,this.size),n=f(e,this.size);if(n!==this.size)return Y.prototype.slice.call(this,t,e);for(var i=this.size-r,o=this._head;r--;)o=o.next;return this.__ownerID?(this.size=i,this._head=o,this.__hash=void 0,this.__altered=!0,this):xr(i,o)},Er.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?xr(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Er.prototype.__iterate=function(t,e){if(e)return this.toSeq().cacheResult.__iterate(t,e);for(var r=0,n=this._head;n&&t(n.value,r++,this)!==!1;)n=n.next;return r},Er.prototype.__iterator=function(t,e){if(e)return this.toSeq().cacheResult().__iterator(t,e);var r=0,n=this._head;return new S(function(){if(n){var e=n.value;return n=n.next,z(t,r++,e)}return I()})},Er.isStack=Or;var Nn="@@__IMMUTABLE_STACK__@@",Vn=Er.prototype;Vn[Nn]=!0,Vn.withMutations=Un.withMutations,Vn.asMutable=Un.asMutable,Vn.asImmutable=Un.asImmutable,Vn.wasAltered=Un.wasAltered;var Yn;t(Ar,Q),Ar.of=function(){return this(arguments)},Ar.fromKeys=function(t){return this(p(t).keySeq())},Ar.prototype.toString=function(){return this.__toString("Set {","}")},Ar.prototype.has=function(t){return this._map.has(t)},Ar.prototype.add=function(t){return Rr(this,this._map.set(t,!0))
+},Ar.prototype.remove=function(t){return Rr(this,this._map.remove(t))},Ar.prototype.clear=function(){return Rr(this,this._map.clear())},Ar.prototype.union=function(){var t=on.call(arguments,0);return t=t.filter(function(t){return 0!==t.size}),0===t.length?this:0===this.size&&1===t.length?this.constructor(t[0]):this.withMutations(function(e){for(var r=0;t.length>r;r++)l(t[r]).forEach(function(t){return e.add(t)})})},Ar.prototype.intersect=function(){var t=on.call(arguments,0);if(0===t.length)return this;t=t.map(function(t){return l(t)});var e=this;return this.withMutations(function(r){e.forEach(function(e){t.every(function(t){return t.contains(e)})||r.remove(e)})})},Ar.prototype.subtract=function(){var t=on.call(arguments,0);if(0===t.length)return this;t=t.map(function(t){return l(t)});var e=this;return this.withMutations(function(r){e.forEach(function(e){t.some(function(t){return t.contains(e)})&&r.remove(e)})})},Ar.prototype.merge=function(){return this.union.apply(this,arguments)},Ar.prototype.mergeWith=function(){var t=on.call(arguments,1);return this.union.apply(this,t)},Ar.prototype.sort=function(t){return Lr(qe(this,t))},Ar.prototype.sortBy=function(t,e){return Lr(qe(this,e,t))},Ar.prototype.wasAltered=function(){return this._map.wasAltered()},Ar.prototype.__iterate=function(t,e){var r=this;return this._map.__iterate(function(e,n){return t(n,n,r)},e)},Ar.prototype.__iterator=function(t,e){return this._map.map(function(t,e){return e}).__iterator(t,e)},Ar.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t);return t?this.__make(e,t):(this.__ownerID=t,this._map=e,this)},Ar.isSet=jr;var Qn="@@__IMMUTABLE_SET__@@",Xn=Ar.prototype;Xn[Qn]=!0,Xn[un]=Xn.remove,Xn.mergeDeep=Xn.merge,Xn.mergeDeepWith=Xn.mergeWith,Xn.withMutations=Un.withMutations,Xn.asMutable=Un.asMutable,Xn.asImmutable=Un.asImmutable,Xn.__empty=Kr,Xn.__make=Ur;var Fn;t(Lr,Ar),Lr.of=function(){return this(arguments)},Lr.fromKeys=function(t){return this(p(t).keySeq())},Lr.prototype.toString=function(){return this.__toString("OrderedSet {","}")
+},Lr.isOrderedSet=Tr;var Gn=Lr.prototype;Gn[yn]=!0,Gn.__empty=Br,Gn.__make=Wr;var Zn;t(Cr,V),Cr.prototype.toString=function(){return this.__toString(Pr(this)+" {","}")},Cr.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},Cr.prototype.get=function(t,e){if(!this.has(t))return e;var r=this._defaultValues[t];return this._map?this._map.get(t,r):r},Cr.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=Object.getPrototypeOf(this).constructor;return t._empty||(t._empty=Jr(this,Qe()))},Cr.prototype.set=function(t,e){if(!this.has(t))throw Error('Cannot set unknown key "'+t+'" on '+Pr(this));var r=this._map&&this._map.set(t,e);return this.__ownerID||r===this._map?this:Jr(this,r)},Cr.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:Jr(this,e)},Cr.prototype.wasAltered=function(){return this._map.wasAltered()},Cr.prototype.__iterator=function(t,e){var r=this;return p(this._defaultValues).map(function(t,e){return r.get(e)}).__iterator(t,e)},Cr.prototype.__iterate=function(t,e){var r=this;return p(this._defaultValues).map(function(t,e){return r.get(e)}).__iterate(t,e)},Cr.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?Jr(this,e,t):(this.__ownerID=t,this._map=e,this)};var $n=Cr.prototype;$n[un]=$n.remove,$n.deleteIn=$n.removeIn=Un.removeIn,$n.merge=Un.merge,$n.mergeWith=Un.mergeWith,$n.mergeIn=Un.mergeIn,$n.mergeDeep=Un.mergeDeep,$n.mergeDeepWith=Un.mergeDeepWith,$n.mergeDeepIn=Un.mergeDeepIn,$n.setIn=Un.setIn,$n.update=Un.update,$n.updateIn=Un.updateIn,$n.withMutations=Un.withMutations,$n.asMutable=Un.asMutable,$n.asImmutable=Un.asImmutable,t(Nr,k),Nr.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(this._step>1?" by "+this._step:"")+" ]"},Nr.prototype.get=function(t,e){return this.has(t)?this._start+u(this,t)*this._step:e},Nr.prototype.contains=function(t){var e=(t-this._start)/this._step;
+return e>=0&&this.size>e&&e===Math.floor(e)},Nr.prototype.slice=function(t,e){return a(t,e,this.size)?this:(t=h(t,this.size),e=f(e,this.size),t>=e?new Nr(0,0):new Nr(this.get(t,this._end),this.get(e,this._end),this._step))},Nr.prototype.indexOf=function(t){var e=t-this._start;if(e%this._step===0){var r=e/this._step;if(r>=0&&this.size>r)return r}return-1},Nr.prototype.lastIndexOf=function(t){return this.indexOf(t)},Nr.prototype.__iterate=function(t,e){for(var r=this.size-1,n=this._step,i=e?this._start+r*n:this._start,o=0;r>=o;o++){if(t(i,o,this)===!1)return o+1;i+=e?-n:n}return o},Nr.prototype.__iterator=function(t,e){var r=this.size-1,n=this._step,i=e?this._start+r*n:this._start,o=0;return new S(function(){var u=i;return i+=e?-n:n,o>r?I():z(t,o++,u)})},Nr.prototype.equals=function(t){return t instanceof Nr?this._start===t._start&&this._end===t._end&&this._step===t._step:Hr(this,t)};var ti;t(Vr,k),Vr.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Vr.prototype.get=function(t,e){return this.has(t)?this._value:e},Vr.prototype.contains=function(t){return X(this._value,t)},Vr.prototype.slice=function(t,e){var r=this.size;return a(t,e,r)?this:new Vr(this._value,f(e,r)-h(t,r))},Vr.prototype.reverse=function(){return this},Vr.prototype.indexOf=function(t){return X(this._value,t)?0:-1},Vr.prototype.lastIndexOf=function(t){return X(this._value,t)?this.size:-1},Vr.prototype.__iterate=function(t){for(var e=0;this.size>e;e++)if(t(this._value,e,this)===!1)return e+1;return e},Vr.prototype.__iterator=function(t){var e=this,r=0;return new S(function(){return e.size>r?z(t,r++,e._value):I()})},Vr.prototype.equals=function(t){return t instanceof Vr?X(this._value,t._value):Hr(t)};var ei;_.Iterator=S,Yr(_,{toArray:function(){se(this.size);var t=Array(this.size||0);return this.valueSeq().__iterate(function(e,r){t[r]=e}),t},toIndexedSeq:function(){return new he(this)},toJS:function(){return this.toSeq().map(function(t){return t&&"function"==typeof t.toJS?t.toJS():t}).__toJS()
+},toJSON:function(){return this.toSeq().map(function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t}).__toJS()},toKeyedSeq:function(){return new ae(this,!0)},toMap:function(){return Le(this.toKeyedSeq())},toObject:function(){se(this.size);var t={};return this.__iterate(function(e,r){t[r]=e}),t},toOrderedMap:function(){return Ir(this.toKeyedSeq())},toOrderedSet:function(){return Lr(d(this)?this.valueSeq():this)},toSet:function(){return Ar(d(this)?this.valueSeq():this)},toSetSeq:function(){return new fe(this)},toSeq:function(){return m(this)?this.toIndexedSeq():d(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Er(d(this)?this.valueSeq():this)},toList:function(){return fr(d(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){var t=on.call(arguments,0);return Oe(this,Se(this,t))},contains:function(t){return this.some(function(e){return X(e,t)})},entries:function(){return this.__iterator(gn)},every:function(t,e){se(this.size);var r=!0;return this.__iterate(function(n,i,o){return t.call(e,n,i,o)?void 0:(r=!1,!1)}),r},filter:function(t,e){return Oe(this,le(this,t,e,!0))},find:function(t,e,r){var n=this.findEntry(t,e);return n?n[1]:r},findEntry:function(t,e){var r;return this.__iterate(function(n,i,o){return t.call(e,n,i,o)?(r=[i,n],!1):void 0}),r},findLastEntry:function(t,e){return this.toSeq().reverse().findEntry(t,e)},forEach:function(t,e){return se(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){se(this.size),t=void 0!==t?""+t:",";var e="",r=!0;return this.__iterate(function(n){r?r=!1:e+=t,e+=null!==n&&void 0!==n?""+n:""}),e},keys:function(){return this.__iterator(dn)},map:function(t,e){return Oe(this,pe(this,t,e))},reduce:function(t,e,r){se(this.size);var n,i;return arguments.length<2?i=!0:n=e,this.__iterate(function(e,o,u){i?(i=!1,n=e):n=t.call(r,n,e,o,u)}),n},reduceRight:function(){var t=this.toKeyedSeq().reverse();return t.reduce.apply(t,arguments)
+},reverse:function(){return Oe(this,ve(this,!0))},slice:function(t,e){return Oe(this,me(this,t,e,!0))},some:function(t,e){return!this.every(Fr(t),e)},sort:function(t){return Oe(this,qe(this,t))},values:function(){return this.__iterator(mn)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(t,e){return o(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return ye(this,t,e)},equals:function(t){return Hr(this,t)},entrySeq:function(){var t=this;if(t._cache)return new j(t._cache);var e=t.toSeq().map(Xr).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter(Fr(t),e)},findLast:function(t,e,r){return this.toKeyedSeq().reverse().find(t,e,r)},first:function(){return this.find(s)},flatMap:function(t,e){return Oe(this,Ie(this,t,e))},flatten:function(t){return Oe(this,ze(this,t,!0))},fromEntrySeq:function(){return new ce(this)},get:function(t,e){return this.find(function(e,r){return X(r,t)},void 0,e)},getIn:function(t,e){for(var r,n=this,i=Ke(t);!(r=i.next()).done;){var o=r.value;if(n=n&&n.get?n.get(o,fn):fn,n===fn)return e}return n},groupBy:function(t,e){return de(this,t,e)},has:function(t){return this.get(t,fn)!==fn},hasIn:function(t){return this.getIn(t,fn)!==fn},isSubset:function(t){return t="function"==typeof t.contains?t:_(t),this.every(function(e){return t.contains(e)})},isSuperset:function(t){return t.isSubset(this)},keySeq:function(){return this.toSeq().map(Qr).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},max:function(t){return De(this,t)},maxBy:function(t,e){return De(this,e,t)},min:function(t){return De(this,t?Gr(t):tn)},minBy:function(t,e){return De(this,e?Gr(e):tn,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return Oe(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return Oe(this,we(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile(Fr(t),e)
+},sortBy:function(t,e){return Oe(this,qe(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return Oe(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return Oe(this,ge(this,t,e))},takeUntil:function(t,e){return this.takeWhile(Fr(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=en(this))}});var ri=_.prototype;ri[pn]=!0,ri[zn]=ri.values,ri.__toJS=ri.toArray,ri.__toStringMapper=Zr,ri.inspect=ri.toSource=function(){return""+this},ri.chain=ri.flatMap,function(){try{Object.defineProperty(ri,"length",{get:function(){if(!_.noLengthWarning){var t;try{throw Error()}catch(e){t=e.stack}if(-1===t.indexOf("_wrapObject"))return console&&console.warn&&console.warn("iterable.length has been deprecated, use iterable.size or iterable.count(). This warning will become a silent error in a future version. "+t),this.size}}})}catch(t){}}(),Yr(p,{flip:function(){return Oe(this,_e(this))},findKey:function(t,e){var r=this.findEntry(t,e);return r&&r[0]},findLastKey:function(t,e){return this.toSeq().reverse().findKey(t,e)},keyOf:function(t){return this.findKey(function(e){return X(e,t)})},lastKeyOf:function(t){return this.findLastKey(function(e){return X(e,t)})},mapEntries:function(t,e){var r=this,n=0;return Oe(this,this.toSeq().map(function(i,o){return t.call(e,[o,i],n++,r)}).fromEntrySeq())},mapKeys:function(t,e){var r=this;return Oe(this,this.toSeq().flip().map(function(n,i){return t.call(e,n,i,r)}).flip())}});var ni=p.prototype;ni[vn]=!0,ni[zn]=ri.entries,ni.__toJS=ri.toObject,ni.__toStringMapper=function(t,e){return e+": "+Zr(t)},Yr(v,{toKeyedSeq:function(){return new ae(this,!1)},filter:function(t,e){return Oe(this,le(this,t,e,!1))},findIndex:function(t,e){var r=this.findEntry(t,e);return r?r[0]:-1},indexOf:function(t){var e=this.toKeyedSeq().keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){return this.toSeq().reverse().indexOf(t)},reverse:function(){return Oe(this,ve(this,!1))},slice:function(t,e){return Oe(this,me(this,t,e,!1))
+},splice:function(t,e){var r=arguments.length;if(e=Math.max(0|e,0),0===r||2===r&&!e)return this;t=h(t,this.size);var n=this.slice(0,t);return Oe(this,1===r?n:n.concat(i(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var r=this.toKeyedSeq().findLastKey(t,e);return void 0===r?-1:r},first:function(){return this.get(0)},flatten:function(t){return Oe(this,ze(this,t,!1))},get:function(t,e){return t=u(this,t),0>t||1/0===this.size||void 0!==this.size&&t>this.size?e:this.find(function(e,r){return r===t},void 0,e)},has:function(t){return t=u(this,t),t>=0&&(void 0!==this.size?1/0===this.size||this.size>t:-1!==this.indexOf(t))},interpose:function(t){return Oe(this,be(this,t))},interleave:function(){var t=[this].concat(i(arguments)),e=Ee(this.toSeq(),k.of,t),r=e.flatten(!0);return e.size&&(r.size=e.size*t.length),Oe(this,r)},last:function(){return this.get(-1)},skipWhile:function(t,e){return Oe(this,we(this,t,e,!1))},zip:function(){var t=[this].concat(i(arguments));return Oe(this,Ee(this,$r,t))},zipWith:function(t){var e=i(arguments);return e[0]=this,Oe(this,Ee(this,t,e))}}),v.prototype[ln]=!0,v.prototype[yn]=!0,Yr(l,{get:function(t,e){return this.has(t)?t:e},contains:function(t){return this.has(t)},keySeq:function(){return this.valueSeq()}}),l.prototype.has=ri.contains,Yr(x,p.prototype),Yr(k,v.prototype),Yr(A,l.prototype),Yr(V,p.prototype),Yr(Y,v.prototype),Yr(Q,l.prototype);var ii={Iterable:_,Seq:O,Collection:N,Map:Le,OrderedMap:Ir,List:fr,Stack:Er,Set:Ar,OrderedSet:Lr,Record:Cr,Range:Nr,Repeat:Vr,is:X,fromJS:F};return ii});
+"""
+
+eval immutable
+
 # JS Reserved words

 reservedInJs = newSetWith ("abstract arguments boolean break byte case catch char class " +
@@ -3796,6 +3898,29 @@
       (Js.binary "-" y x))"""
     "(fibonacci 7)", 8

+  'Map literal'
+  """
+    data {a: True b: False}
+
+    key? (macro [what in]
+      (: (Fn k (Map k i) Bool))
+      (Js.call (Js.access in "has") {what}))
+
+    at (macro [key in]
+      (: (Fn k (Map k i) i))
+      (Js.call (Js.access in "get") {key}))
+  """
+  """(== (key? "c" data) (at "b" data))""", yes
+
+  'create Set'
+  """
+    data (Set "a" "b" "c")
+
+    elem? (macro [what in]
+      (: (Fn i (Set i) Bool))
+      (Js.call (Js.access in "has") {what}))
+  """
+  """(elem? "a" data)""", yes

   # TODO: support matching with the same name
   #       to implement this we need the iife to take as arguments all variables


(re)implemented cart counter such that it counts the quantity in local storage dict.

--- assets/coffeescript/pupil_store.coffee
+++ assets/coffeescript/pupil_store.coffee
@@ -68,7 +68,7 @@

 #{ p.label }

 #{ p.specs }

€ #{ p.cost }

-                      Add to Cart
+                      Add to Cart

"
@@ -78,7 +78,7 @@

   eventAddToCart: ->
     if $(@storePage).length > 0
-      @addToCartButton.click (event)=>
+      $(@addToCartClass).click (event)=>
           event.preventDefault()
           addToCartBtn = $(event.target)
           if not $(@addToCartBtn).hasClass('Button--state-inactive')
@@ -86,30 +86,39 @@
             productType = $(addToCartBtn).data('product')

             if productType is "pupil"
-              worldId = $(@worldConfigActiveClass).data('id')
-              eyeId = $(@eyeConfigActiveClass).data('id')
-              id = [worldId,eyeId]
-              price = @_calcConfigSubTotal([@worldConfigActiveClass,@eyeConfigActiveClass,@licenseConfigActiveClass])
-              specs = $(@worldConfigActiveClass).data('specs') + "," + $(@eyeConfigActiveClass).data('specs')
-              license = $(@licenseConfigActiveClass).data('id')
+              worldId = $(@worldConfigActiveClass).attr('id')
+              eyeId = $(@eyeConfigActiveClass).attr('id')
+              licenseId = $(@licenseConfigActiveClass).attr('id')
+              orderItems = [worldId,eyeId,licenseId]
+              # id = [worldId,eyeId]
+              # price = @_calcConfigSubTotal([@worldConfigActiveClass,@eyeConfigActiveClass,@licenseConfigActiveClass])
+              # specs = $(@worldConfigActiveClass).data('specs') + "," + $(@eyeConfigActiveClass).data('specs')
+              # license = $(@licenseConfigActiveClass).data('id')
             else
-              productType = $(addToCartBtn).data('product')
-              id = [$(addToCartBtn).data('id')]
-              price = $(addToCartBtn).data('cost')
-              specs = $(addToCartBtn).data('specs')
-              license = "not applicable"
+              orderItems = [$(addToCartBtn).attr('id')]
+              # id = [$(addToCartBtn).data('id')]
+              # price = $(addToCartBtn).data('cost')
+              # specs = $(addToCartBtn).data('specs')
+              # license = "not applicable"

-            key = @_uniqueId()
-            item = {
-              "product" : productType
-              "id": id
-              "specs": specs
-              "price": price
-              "quantity": 1
-              "license": license
-            }
-            # save to local storage & update the nav counter
-            LocalStorage.set(key, JSON.stringify(item))
+            # check if the order already exists in the cart
+            # if so, then increment the quantity of that order in the cart
+            existingOrderKey = @_compareOrders(orderItems)
+            console.log existingOrderKey
+            if existingOrderKey
+              existingOrder = JSON.parse(LocalStorage.get(existingOrderKey))
+              existingOrder.qty += 1
+              LocalStorage.set(existingOrderKey,JSON.stringify(existingOrder))
+            else
+              # add new key
+              key = @_uniqueId()
+              item = {
+                "order" : orderItems
+                "qty"   : 1
+              }
+              LocalStorage.set(key, JSON.stringify(item))
+
+            # update the nav counter
             @eventUpdateCartNavCounter()
           else
             return false
@@ -123,7 +132,9 @@
       @eventUpdateCartNavCounter()

   eventUpdateCartNavCounter: ->
-    counter = if LocalStorage.length() > 0 then LocalStorage.length() else ""
+    qty = [v.qty for k,v of LocalStorage.dict()]
+    qtySum = qty[0].reduce (a,b) -> a + b
+    counter = if LocalStorage.length() > 0 then qtySum else ""
     $(@cartNavCounter).text("#{ counter }")

   eventUpdateConfig: ->
@@ -423,6 +434,18 @@
     id.substr 0, len
     return id

+  _arrayEqual: (a, b) ->
+    # a.length is b.length and
+    a.every (elem, i) -> elem is b[i]
+
+  _compareOrders: (orderItems)->
+    if LocalStorage.length() > 0
+      for k,v of LocalStorage.dict()
+        console.log v.order
+        console.log orderItems
+        if @_arrayEqual(v.order,orderItems)
+          return k
+

 $(document).ready ->
   s = new PupilStore


remove console log

remove console log

--- assets/coffeescript/pupil_store.coffee
+++ assets/coffeescript/pupil_store.coffee
@@ -473,7 +473,6 @@
           $(p_transfer).val('purchaseorder')
         else
           $(p_transfer).val('banktransfer')
-        # console.log($(p_transfer).val())

       else
         $(button).toggleClass('checkmark--active')
@@ -497,10 +496,8 @@

           if $(o_input).val() == 'order'
             $(input_transfer).val('banktransfer')
-            console.log($(input_transfer).val())
           else
             $(input_transfer).val('purchaseorder')
-            console.log($(input_transfer).val())

   eventSubmitForm: ->
     if $(@cartPage).length > 0
@@ -542,8 +539,6 @@

           formData_formatted_JSON = JSON.stringify(formData_formatted)
           url = "https://p-u-p-i-l.com/order/form_handler"
-
-          console.log(formData_formatted_JSON)

           xhr = new XMLHttpRequest()


Fix error

Fix error

--- dev/index.coffee
+++ dev/index.coffee
@@ -11,5 +11,5 @@
         if typeof @bootstrapper is 'undefined'
             @bootstrapper = @getBootstrapper()

-        @bootstraopper.run()
+        @bootstrapper.run()
         return


Tweak

Tweak

--- lib/join_table_controller_singleton.coffee
+++ lib/join_table_controller_singleton.coffee
@@ -18,7 +18,7 @@
     route_root = route_parts.join('/')

     schema = options.model_type.schema()
-    for name, relation of schema.relations
+    for key, relation of schema.relations
       continue unless (relation and relation.join_table)
       try
         join_table_url = _.result(relation.join_table.prototype, 'url')


Add title for songs route.

Add title for songs route.

--- app/client/js/title.coffee
+++ app/client/js/title.coffee
@@ -17,12 +17,14 @@
   @MSG_ME: goog.getMsg 'Me'
   @MSG_NEW_SONG: goog.getMsg 'New Song'
   @MSG_NOT_FOUND: goog.getMsg 'Page Not Found'
+  @MSG_SONGS: goog.getMsg 'Songs'
   @MSG_TRASH: goog.getMsg 'Trash'

   get: ->
     switch @routes.active
       when @routes.about then Title.MSG_ABOUT
       when @routes.home then Title.MSG_HOME
+      when @routes.songs then Title.MSG_SONGS
       when @routes.me then Title.MSG_ME
       when @routes.song then @getSongTitle @songsStore.songsByUrl[0]
       when @routes.mySong, @routes.editSong


Fix caching bug; might take performance hit

--- src/view.coffee
+++ src/view.coffee
@@ -353,22 +353,15 @@
       # line that we contain.
       #
       # Return child node.
-      #
-      # This is a void computeDimensinos that should be overridden.
       computeDimensions: (startLine, force, root = false) ->
         if @computedVersion is @model.version and not force
           return

         oldDimensions = @dimensions
         oldDistanceToBase = @distanceToBase
-
-        # copy min dimensions
-        if @dimensions.length > @lineLength
-          @dimensions.length = @distanceToBase.length = @lineLength
-        else
-          until @dimensions.length is @lineLength
-            @dimensions.push new draw.Size 0, 0
-            @distanceToBase.push {above: 0, below: 0}
+
+        @dimensions = (new draw.Size 0, 0 for [0...@lineLength])
+        @distanceToBase = ({above: 0, below: 0} for [0...@lineLength])

         for size, i in @minDimensions
           @dimensions[i].width = size.width; @dimensions[i].height = size.height
@@ -407,6 +400,7 @@
             break

         @changedBoundingBox or= changed
+        console.log 'force:', changed

         for childObj in @children
           @view.getViewNodeFor(childObj.child).computeDimensions(


$XAPI handles EHOSTUNREACH errors.

$XAPI handles EHOSTUNREACH errors.

--- src/xapi.coffee
+++ src/xapi.coffee
@@ -69,6 +69,7 @@
         # least once to know who is the new pool master.
         when 'ECONNRESET', \
              'ECONNREFUSED', \
+             'EHOSTUNREACH', \
              'HOST_STILL_BOOTING', \
              'HOST_HAS_NO_MANAGEMENT_IP'
           # Node.js seems to reuse the broken socket, so we add a small


removes cache true from auctions app

removes cache true from auctions app

--- apps/auction/routes.coffee
+++ apps/auction/routes.coffee
@@ -62,7 +62,6 @@
       myActiveBids = res?[2]?[2]
       Q.promise (resolve) ->
         articles.fetch
-          cache: true
           data: published: true, auction_id: auction.get('_id')
           complete: resolve
     .then ->
@@ -123,7 +122,6 @@
 @redirectLive = (req, res, next) ->
   auction = new Auction id: req.params.id
   auction.fetch
-    cache: true
     error: res.backboneError
     success: ->
       liveUrl = "#{PREDICTION_URL}/#{auction.get('id')}/login"


Renamed method name

Renamed method name

--- app/views/tile_view.coffee
+++ app/views/tile_view.coffee
@@ -29,7 +29,7 @@
   # sound: new Audio('sounds/tink.mp3')

   initialize: ->
-    _.bindAll @, 'render', 'playTile', 'dragTileStart', 'dragTileMove', 'dragTileEnd'
+    _.bindAll @, 'render', 'play', 'dragTileStart', 'dragTileMove', 'dragTileEnd'
     @model.bind('change', @render)
     @model.view = @


config: reduce influxdb retention to 30d

--- config.coffee
+++ config.coffee
@@ -33,7 +33,7 @@
     DB: env.HYPERPLANE_INFLUX_DB or 'hyperplane'
     HOST: env.INFLUX_HOST or 'localhost'
     PORT: 8086
-    RETENTION_DAYS: 60
+    RETENTION_DAYS: 30
   REDIS:
     PREFIX: env.HYPERPLANE_REDIS_PREFIX or 'hyperplane'
     HOST: env.REDIS_HOST or 'localhost'


Removed empty parameter at drag finished event emitter in unsetDragView method of KDWindowController.

--- client/Framework/core/KDWindowController.coffee
+++ client/Framework/core/KDWindowController.coffee
@@ -218,7 +218,7 @@
   unsetDragView:(e)->

     @setDragInAction no
-    @dragView.emit "DragFinished", e, @dragState
+    @dragView.emit "DragFinished", e
     @dragView = null


activity: remove not used function

activity: remove not used function

--- client/activity/lib/flux/actions/channel.coffee
+++ client/activity/lib/flux/actions/channel.coffee
@@ -79,31 +79,6 @@

 ###*
- * Helper function to convert 'private' and 'public' types to internally
- * understandable type names.
- *
- * @param {string} type - either 'public' or 'private'
- * @param {string} id
- * @param {Array<String,
-###
-sanitizeTypeAndId = (type, id) ->
-
-  { socialApiChannelId, socialApiAnnouncementChannelId } = getGroup()
-  { getPrefetchedData } = kd.singletons.socialapi
-
-  switch type
-    when 'public'
-      switch getChannelTypeByName id
-        when 'group' then ['group', socialApiChannelId]
-        when 'announcement' then ['announcement', socialApiAnnouncementChannelId]
-        else ['topic', id]
-    when 'private'
-      switch id
-        when getPrefetchedData('bot').id then ['bot', id]
-        else ['privatemessage', id]
-
-
-###*
  * Loads channel by given id
  *
  * @param {string} id - channel id
@@ -456,6 +431,12 @@

 emptyPromise = new Promise (resolve) -> resolve()

+
+###*
+ * Glances channel with given channelId.
+ *
+ * @param {string} channelId
+###
 glance = do (glancingMap = {}) -> (channelId) ->

   return emptyPromise  if glancingMap[channelId]


Client: Activity: Added className and updated render method to wrapped time with span element

--- client/app/lib/components/common/timeago.coffee
+++ client/app/lib/components/common/timeago.coffee
@@ -6,6 +6,9 @@

   @propTypes =
     from : React.PropTypes.string.isRequired
+
+  defaultProps =
+    className : ''

   constructor: (props) ->

@@ -28,6 +31,11 @@
     kd.utils.killRepeat @_interval

-  render: -> <time>{timeago @state.from}</time>
+  render: ->
+
+    <span className={kd.utils.curry "u-color-light-text", @props.className}>
+      <time>{timeago @state.from}</time>
+    </span>

+


reticulating results analysis

reticulating results analysis

--- coffee/main.coffee
+++ coffee/main.coffee
@@ -1166,6 +1166,7 @@
     console.log("asking addie to run the experiment")
     $.get "/addie/"+dsg+"/design/run", (data) =>
       console.log("run result: " + data)
+    window.open(location.origin + "/results.html?xp=" + dsg)

 class EBoxSelectHandler


Add auto-incrementing Turbolinks.Visit::identifier


Comments

Comments

--- apps/artwork/client/view-in-room.coffee
+++ apps/artwork/client/view-in-room.coffee
@@ -10,9 +10,11 @@
   roomWidth: 6578
   benchRatio: 5.5

+  # Should be visually at about 57" from interstitial
   eyeLevel: ->
     0.132 * @roomWidth

+  # Should be visually at about 12" from interstitial
   groundLevel: ->
     0.095 * @roomWidth


Added permission to reRun

Added permission to reRun

--- sample.coffee
+++ sample.coffee
@@ -162,7 +162,7 @@
       'click .rerun-job': (e, t) ->
          console.log "Rerunning job: #{this._id}"
          job = myJobs.makeJob this
-         job.rerun() if job
+         job.rerun({ wait: 15000 }) if job
       'click .pause-job': (e, t) ->
          console.log "Pausing job: #{this._id}"
          job = myJobs.makeJob this
@@ -306,6 +306,7 @@
    myJobs.setLogStream process.stdout
    myJobs.allow
       manager: (userId, method, params) -> return userId?
+      jobRerun: (userId, method, params) -> return userId?

    Meteor.startup () ->

@@ -367,7 +368,7 @@
                inputFileId: file._id
                outputFileId: outputFileId
             )
-            if jobId = job.delay(5000).retry({ retryWait: 20000, retries: 10 }).save()
+            if jobId = job.delay(5000).retry({ wait: 20000, retries: 10 }).save()
                myData.update({ _id: file._id }, { $set: { 'metadata._Job': jobId, 'metadata.thumb': outputFileId } })
                myData.update({ _id: outputFileId }, { $set: { 'metadata._Job': jobId, 'metadata.thumbOf': file._id } })
             else


Allow templateHelpers to take a function

--- src/scripts/helpers/backbone/views/base.coffee
+++ src/scripts/helpers/backbone/views/base.coffee
@@ -43,12 +43,15 @@
     _render: () ->
       data = @model?.toJSON() or {}

-      # Add data from template helpers to the model's data
-      _.each @templateHelpers, (value, key) =>
-        if typeof value is 'function'
-          data[key] = value.apply(@)
-        else
-          data[key] = value
+      if typeof @templateHelpers is 'function'
+        _.extend(data, @templateHelpers())
+      else
+        # Add data from template helpers to the model's data
+        _.each @templateHelpers, (value, key) =>
+          if typeof value is 'function'
+            data[key] = value.apply(@)
+          else
+            data[key] = value

       @_renderDom(data)


Client: Display Leftovers canned text.

Client: Display Leftovers canned text.

--- server/bw/data/items.coffee
+++ server/bw/data/items.coffee
@@ -370,7 +370,7 @@
   this::endTurn = ->
     maxHP = @pokemon.stat('hp')
     return  if maxHP == @pokemon.currentHP
-    @battle.cannedText('ITEM_RESTORE', @pokemon.name, @constructor)
+    @battle.cannedText('ITEM_RESTORE', @pokemon, @constructor)
     amount = Math.floor(maxHP / 16)
     amount = 1  if amount == 0
     @pokemon.heal(amount)


VocabBank snippet (#157)

VocabBank snippet (#157)

--- snippets/language-coursescript.cson
+++ snippets/language-coursescript.cson
@@ -1792,3 +1792,14 @@
       display_layout: REGULAR
       \"""
     """
+  'VocabBank':
+    'prefix': "VocabBank"
+    'body': """
+    [TYPE VocabBank]
+    Audio(target=true):${1:vocabulary}
+    Text:${2:chinese text}
+    Text:${3:word property}
+    Text:${4:IPA}
+    Opts:
+    Text:${5:distracter}
+    """


added comment for background polling change

--- services/web/public/coffee/ide/editor/controllers/SavingNotificationController.coffee
+++ services/web/public/coffee/ide/editor/controllers/SavingNotificationController.coffee
@@ -27,6 +27,8 @@
 							doc: ide.fileTreeManager.findEntityById(doc_id)
 						}

+			# for performance, only update the display if the old or new
+			# statuses have any unsaved files
 			if _.size(newStatus) or _.size(oldStatus)
 				$scope.docSavingStatus = newStatus
 				$scope.$apply()


Symlink require admin on Windows so let specs pass

--- spec/default-file-icons-spec.coffee
+++ spec/default-file-icons-spec.coffee
@@ -1,5 +1,6 @@
 fs = require 'fs-plus'
 path = require 'path'
+process = require 'process'
 temp = require('temp').track()

 DefaultFileIcons = require '../lib/default-file-icons'
@@ -41,7 +42,12 @@
       filePath = path.join(tempDir, 'foo.bar')
       linkPath = path.join(tempDir, 'link.bar')
       fs.writeFileSync(filePath, '')
-      fs.symlinkSync(filePath, linkPath)
+      try
+        fs.symlinkSync(filePath, linkPath)
+      catch err
+        # Symlinks are Administrator only on Windows
+        return if err.code is 'EPERM' and process.platform is 'win32'
+        throw err

       expect(fileIcons.iconClassForPath(linkPath)).toEqual('icon-file-symlink-file')

@@ -49,6 +55,11 @@
       filePath = path.join(tempDir, 'foo.zip')
       linkPath = path.join(tempDir, 'link.zip')
       fs.writeFileSync(filePath, '')
-      fs.symlinkSync(filePath, linkPath)
+      try
+        fs.symlinkSync(filePath, linkPath)
+      catch err
+        # Symlinks are Administrator only on Windows
+        return if err.code is 'EPERM' and process.platform is 'win32'
+        throw err

       expect(fileIcons.iconClassForPath(linkPath)).toEqual('icon-file-symlink-file')


:art: [message-registry-spec] Enhance ::onDidUpdateMessages spec

--- spec/message-registry-spec.coffee
+++ spec/message-registry-spec.coffee
@@ -56,21 +56,21 @@
       expect(messageRegistry.publicMessages.length).toBe(1)

   describe '::onDidUpdateMessages', ->
-    it 'is triggered asyncly with results', ->
+    it 'is triggered asyncly with results and provides a diff', ->
       wasUpdated = false
       {linterRegistry, editorLinter} = getLinterRegistry()
       linterRegistry.onDidUpdateMessages (linterInfo) ->
         messageRegistry.set(linterInfo)
         expect(messageRegistry.hasChanged).toBe(true)
         messageRegistry.updatePublic()
-      gotMessages = null
-      messageRegistry.onDidUpdateMessages ({added}) ->
+      messageRegistry.onDidUpdateMessages ({added, removed, messages}) ->
         wasUpdated = true
-        gotMessages = added
+        expect(added.length).toBe(1)
+        expect(removed.length).toBe(0)
+        expect(messages.length).toBe(1)
       waitsForPromise ->
         linterRegistry.lint({onChange: false, editorLinter}).then ->
           expect(wasUpdated).toBe(true)
-          expect(gotMessages.length).toBe(1)
           linterRegistry.deactivate()

   describe '::deleteEditorMessages', ->


Javascript required for previous commit.

--- app/assets/javascripts/crm_chosen.js.coffee
+++ app/assets/javascripts/crm_chosen.js.coffee
@@ -20,9 +20,12 @@

 (($j) ->

-  # Initialize chosen select lists for certain fields
-  crm.init_chosen_fields = ->
-    $j("select[name*='assigned_to'], select[name*='[country]'], .chzn-select").each ->
-      new Chosen this, { allow_single_deselect: true }
+  # Initialize any chosen select lists after every Ajax response
+  Ajax.Responders.register({
+    onComplete: ->
+      $j("select[name*='assigned_to'], select[name*='[country]'], .chzn-select").each ->
+        unless $j(this).hasClass('chzn-done')
+          new Chosen this, { allow_single_deselect: true }
+  })

 ) (jQuery)


OX-214 small bug

OX-214 small bug

--- app/assets/javascripts/level_creator.coffee
+++ app/assets/javascripts/level_creator.coffee
@@ -31,6 +31,9 @@
       keyboard : false
       backdrop : "static"
     )
+
+    $("#dimension-modal [type=submit]").on "click", (event) ->
+      event.preventDefault() if $(this).hasClass("disabled")

     $("#dimension-modal").on "submit", (event) =>


OX-214 optimized drawing

OX-214 optimized drawing

--- app/assets/javascripts/level_creator.coffee
+++ app/assets/javascripts/level_creator.coffee
@@ -72,20 +72,26 @@

     { width, height } = @canvas

-    imageData = @context.getImageData(0, 0, width, height)
+    imageDataObject = @context.getImageData(0, 0, width, height)
+    imageData = imageDataObject.data
+
+    sourceData = @data

     indexSource = sliderValue * width * height
     indexTarget = 0
+
     for x in [0...width]
       for y in [0...height]
-        for color in [0...3] # r,g,b
-          imageData.data[indexTarget++] = @data[indexSource]
+        # r,g,b
+        imageData[indexTarget++] = sourceData[indexSource]
+        imageData[indexTarget++] = sourceData[indexSource]
+        imageData[indexTarget++] = sourceData[indexSource]

         # alpha
-        imageData.data[indexTarget++] = 255
+        imageData[indexTarget++] = 255
         indexSource++

-    @context.putImageData(imageData, 0, 0)
+    @context.putImageData(imageDataObject, 0, 0)


Test aliasing of != to <>

Test aliasing of != to <>

--- specs/sql/sql-operators.spec.coffee
+++ specs/sql/sql-operators.spec.coffee
@@ -73,9 +73,14 @@
         q = sql.from('customers').where(firstName: sql.isNull, lastName: sql.isGood)
         h.assertSql(q, e)

-    it 'properly supports columns as patterns in pattern match operators', ->
+    it 'supports columns as patterns in pattern match operators', ->
         q = sql.from('customers').where(firstName: sql.contains(sql.name('lastName')))
         e = "SELECT * FROM [customers] WHERE [firstName] LIKE '%' + [lastName] + '%'"
         h.assertSql(q, e)
+
+    it 'aliases != to <>', ->
+        q = sql.from('customers').where(firstName: { '!=': 'Neville' })
+        e = "SELECT * FROM [customers] WHERE [firstName] <> 'Neville'"
+        h.assertSql(q, e)

 )


Fix mostrar tipo

Fix mostrar tipo

--- app/assets/javascripts/paginacion.js.coffee
+++ app/assets/javascripts/paginacion.js.coffee
@@ -1,4 +1,4 @@
 $(document)
-  .on 'change', '.mostrar-tipo', (evt) ->
+  .on 'change', '.mostrar-tipo select', (evt) ->
     url = URI(location.href).removeQuery('mostrar[tipo]').addQuery('mostrar[tipo]', this.value)
     Turbolinks.visit(url.toString())


remove unused renderSections method

remove unused renderSections method

It's functionality is now in the WeakerSections component.

--- src/components/learning-guide/weaker-panel.cjsx
+++ src/components/learning-guide/weaker-panel.cjsx
@@ -22,16 +22,6 @@
   renderLackingData: ->

{@props.weakerEmptyMessage}

-  renderSections: (validSections, displayCount) ->
-    # Sort by value and pick 'displayCount' of the weakest
-    weakestSections = _.chain(validSections)
-      .sortBy((s) -> s.clue.value )
-      .first(displayCount)
-      .value()
-
-    for section, i in weakestSections
-

-
   render: ->
     # Do not render if we have no sections
     return null if @props.sections.length is 0


sign out button done

sign out button done

--- app/components/group-page/group-page.coffee
+++ app/components/group-page/group-page.coffee
@@ -1,7 +1,7 @@
 module.exports =
   url: '/groups/:groupId'
   template: require('./group-page.html')
-  controller: ($scope, Records, $stateParams, $location, $window, ipCookie, AuthenticateUser) ->
+  controller: ($scope, Records, $stateParams, $location, $window, ipCookie, AuthenticateUser, $auth, Toast) ->
     $scope.contributionsLoaded = $scope.commentsLoaded = $scope.membershipsLoaded = false

     AuthenticateUser().then (currentUser) ->
@@ -39,4 +39,11 @@
     $scope.openFeedbackForm = ->
       $window.location.href = 'https://docs.google.com/forms/d/1-_zDQzdMmq_WndQn2bPUEW2DZQSvjl7nIJ6YkvUcp0I/viewform?usp=send_form';

+    $scope.signOut = ->
+       $auth.signOut().then ->
+          Toast.show("You've been signed out")
+          ipCookie.remove('currentGroupId')
+          ipCookie.remove('currentUserId')
+          $location.path('/')
+
     return


Null safe access of `id` property, needed as user can be null.

--- services/track-changes/app/coffee/UpdatesManager.coffee
+++ services/track-changes/app/coffee/UpdatesManager.coffee
@@ -192,7 +192,7 @@
 				# if not, add them to the users list of the earliest update
 				userExists = false
 				for user in earliestUpdate.meta.users
-					if (!user and !update.meta.user) or (user.id == update.meta.user?.id)
+					if (!user and !update.meta.user) or (user?.id == update.meta.user?.id)
 						userExists = true
 						break
 				if !userExists


fixes 2356

fixes 2356

--- app/pages/lab/workflow-viewer/workflow.cjsx
+++ app/pages/lab/workflow-viewer/workflow.cjsx
@@ -48,7 +48,7 @@
               @addConnection(c, id, nextTask, previousTask)
           else
             for a, adx in task.answers
-              c = ["#{id}_answer_#{adx}", a.next ? 'end']
+              c = ["#{id}_answer_#{adx}", if a.next then a.next else 'end']
               @addConnection(c, id, nextTask, previousTask)
         when 'multiple'
           if task.subtask
@@ -56,17 +56,17 @@
               c = ["#{id}_next", task.next]
               @addConnection(c, id, nextTask, previousTask)
           else
-            c = ["#{id}_next", task.next ? 'end']
+            c = ["#{id}_next", if task.next then task.next else 'end']
             @addConnection(c, id, nextTask, previousTask)
         when 'drawing'
-          c = ["#{id}_next", task.next ? 'end']
+          c = ["#{id}_next", if task.next then task.next else 'end']
           @addConnection(c, id, nextTask, previousTask)
           for a, adx in task.tools
             if a.details[0]?
               c = ["#{id}_answer_#{adx}", a.details[0]]
               @addConnection(c, id, nextTask, previousTask)
         else
-          c=["#{id}_next", task.next ? 'end']
+          c=["#{id}_next", if task.next then task.next else 'end']
           @addConnection(c, id, nextTask, previousTask)
       nextTask[id] ?= {'end': 'end'}
     @setState({nextTask: nextTask, previousTask: previousTask})


Push player away from walls on collision

--- app/scripts/components/ScrollWall.js.coffee
+++ app/scripts/components/ScrollWall.js.coffee
@@ -14,11 +14,11 @@
     @wallEnd = Crafty.e('2D, Canvas, Color, ScrollFront')
       .attr(x: - (Crafty.viewport.x - Crafty.viewport.width) - 3, y: 0, h: Crafty.viewport.height, w: 2)

-    @wallTop = Crafty.e('2D, Canvas, Edge')
+    @wallTop = Crafty.e('2D, Canvas, Edge, Collision')
       .attr(x: 0, y: 40, h: 2, w: Crafty.viewport.width)

-    @wallBottom = Crafty.e('2D, Canvas, Edge')
-      .attr(x: 0, y: Crafty.viewport.height, h: 2, w: Crafty.viewport.width)
+    @wallBottom = Crafty.e('2D, Canvas, Edge, Collision')
+      .attr(x: 0, y: Crafty.viewport.height - 2, h: 2, w: Crafty.viewport.width)

     @bind 'Remove', ->
@@ -59,6 +59,19 @@
         p = e.obj
         p.attr x: p.x + @_speed.x

+    @wallTop.onHit 'PlayerControlledShip', (el) =>
+      # Push the player downward
+      for e in el
+        p = e.obj
+        p.attr y: p.y + @_speed.y
+
+    @wallBottom.onHit 'PlayerControlledShip', (el) =>
+      # Push the player upward
+      console.log 'floor collide'
+      for e in el
+        p = e.obj
+        p.attr y: @wallBottom.y - p.h
+
   scrollWall: (speed) ->
     if speed.x? && speed.y?
       @_speed.x = speed.x


Add damage sprite for player

Add damage sprite for player

--- app/scripts/components/ShipSpawnable.coffee
+++ app/scripts/components/ShipSpawnable.coffee
@@ -72,6 +72,12 @@
     @ship.start()
     @listenTo @ship, 'Hit', (d) ->
       @loseHealth(d.damage)
+
+      sprite = 0
+      healthPerc = @health / @maxHealth
+      sprite = 2 if healthPerc < .3
+      @ship.sprite(0, sprite)
+
       if (@health < 0)
         @ship.trigger('Die')


:white_check_mark: Update TokenizedBuffer specs

--- spec/tokenized-buffer-spec.coffee
+++ spec/tokenized-buffer-spec.coffee
@@ -154,7 +154,7 @@
           it "updates tokens to reflect the change", ->
             buffer.setTextInRange([[0, 0], [2, 0]], "foo()\n7\n")

-            expect(tokenizedBuffer.tokenizedLineForRow(0).tokens[1]).toEqual(value: '(', scopes: ['source.js', 'meta.brace.round.js'])
+            expect(tokenizedBuffer.tokenizedLineForRow(0).tokens[1]).toEqual(value: '(', scopes: ['source.js', 'meta.function-call.js', 'punctuation.definition.arguments.begin.js'])
             expect(tokenizedBuffer.tokenizedLineForRow(1).tokens[0]).toEqual(value: '7', scopes: ['source.js', 'constant.numeric.js'])
             # line 2 is unchanged
             expect(tokenizedBuffer.tokenizedLineForRow(2).tokens[2]).toEqual(value: 'if', scopes: ['source.js', 'keyword.control.js'])
@@ -201,7 +201,7 @@
             expect(tokenizedBuffer.tokenizedLineForRow(0).tokens[0]).toEqual(value: 'var', scopes: ['source.js', 'storage.modifier.js'])

             # previous line 3 should be combined with input to form line 1
-            expect(tokenizedBuffer.tokenizedLineForRow(1).tokens[0]).toEqual(value: 'foo', scopes: ['source.js'])
+            expect(tokenizedBuffer.tokenizedLineForRow(1).tokens[0]).toEqual(value: 'foo', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'])
             expect(tokenizedBuffer.tokenizedLineForRow(1).tokens[6]).toEqual(value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'])

             # lines below deleted regions should be shifted upward
@@ -245,12 +245,12 @@
             expect(tokenizedBuffer.tokenizedLineForRow(0).tokens[0]).toEqual( value: 'var', scopes: ['source.js', 'storage.modifier.js'])

             # 3 new lines inserted
-            expect(tokenizedBuffer.tokenizedLineForRow(1).tokens[0]).toEqual(value: 'foo', scopes: ['source.js'])
-            expect(tokenizedBuffer.tokenizedLineForRow(2).tokens[0]).toEqual(value: 'bar', scopes: ['source.js'])
-            expect(tokenizedBuffer.tokenizedLineForRow(3).tokens[0]).toEqual(value: 'baz', scopes: ['source.js'])
+            expect(tokenizedBuffer.tokenizedLineForRow(1).tokens[0]).toEqual(value: 'foo', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'])
+            expect(tokenizedBuffer.tokenizedLineForRow(2).tokens[0]).toEqual(value: 'bar', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'])
+            expect(tokenizedBuffer.tokenizedLineForRow(3).tokens[0]).toEqual(value: 'baz', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'])

             # previous line 2 is joined with quux() on line 4
-            expect(tokenizedBuffer.tokenizedLineForRow(4).tokens[0]).toEqual(value: 'quux', scopes: ['source.js'])
+            expect(tokenizedBuffer.tokenizedLineForRow(4).tokens[0]).toEqual(value: 'quux', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'])
             expect(tokenizedBuffer.tokenizedLineForRow(4).tokens[4]).toEqual(value: 'if', scopes: ['source.js', 'keyword.control.js'])

             # previous line 3 is pushed down to become line 5


Add newline

Add newline

--- assets/scripts/app/views/annotations.coffee
+++ assets/scripts/app/views/annotations.coffee
@@ -1,2 +1,2 @@
 Travis.reopen
-  AnnotationsView: Travis.View.extend+  AnnotationsView: Travis.View.extend


profile: wip date

profile: wip date

--- client/landing/app/Applications/Activity.kdapplication/ContentDisplays/blogpost.coffee
+++ client/landing/app/Applications/Activity.kdapplication/ContentDisplays/blogpost.coffee
@@ -76,20 +76,9 @@
 class StaticBlogPostListItem extends KDListItemView
   constructor:(options,data)->
     super options,data
-    # getBlogPosts = (blogPosts=[])->
-    #   posts = ""
-    #   for blog in blogPosts
-    @postDate = @getData().meta.createdAt
+    @postDate = new Date @getData().meta.createdAt
+    @postDate = @postDate.toLocaleString() # "dddd, mmmm dS, yyyy at h:MM:ss TT"
     # postDate = require('dateformat')(blog.meta.createdAt,"dddd, mmmm dS, yyyy at h:MM:ss TT")
-    #     posts+="""
-    #

-    #
#{blog.title}#{postDate}

-    #

-    #           #{blog.html}
-    #

-    #

-    #     """
-    #   posts

     @setClass 'content-item'


Add a fallback for Safari copy-to-clipboard

Also, hide the tooltip in a less stupid way.

Closes #3547

--- app/assets/javascripts/copy_to_clipboard.js.coffee
+++ app/assets/javascripts/copy_to_clipboard.js.coffee
@@ -9,13 +9,24 @@
   clipboard.on 'success', (e) ->
     $(e.trigger).
       tooltip(trigger: 'manual', placement: 'auto bottom', title: 'Copied!').
-      tooltip('show')
+      tooltip('show').
+      one('mouseleave', -> $(this).tooltip('hide'))

     # Clear the selection and blur the trigger so it loses its border
     e.clearSelection()
     $(e.trigger).blur()

-    # Manually hide the tooltip after 1 second
-    setTimeout(->
-      $(e.trigger).tooltip('hide')
-    , 1000)
+  # Safari doesn't support `execCommand`, so instead we inform the user to
+  # copy manually.
+  #
+  # See http://clipboardjs.com/#browser-support
+  clipboard.on 'error', (e) ->
+    if /Mac/i.test(navigator.userAgent)
+      title = "Press ⌘-C to copy"
+    else
+      title = "Press Ctrl-C to copy"
+
+    $(e.trigger).
+      tooltip(trigger: 'manual', placement: 'auto bottom', html: true, title: title).
+      tooltip('show').
+      one('mouseleave', -> $(this).tooltip('hide'))


make similar to notes

make similar to notes

--- app/assets/javascripts/socializer/shares.js.coffee
+++ app/assets/javascripts/socializer/shares.js.coffee
@@ -5,4 +5,9 @@
 jQuery ->
   if $('body').data('controller') == 'shares'
     url = $('#share_object_ids').data('path')
-    $('#share_object_ids').tokenInput(url, { minChars: 0 })
+    prepopulate = null
+
+    $('#share_object_ids').tokenInput url,
+      minChars: 0
+      preventDuplicates: true
+      prePopulate: prepopulate


Link backwards to dashboard from language selection, completing navigation

--- app/assets/javascripts/vimeo_integration.js.coffee
+++ app/assets/javascripts/vimeo_integration.js.coffee
@@ -98,7 +98,8 @@
         </select>"

       template + "

-
Get Quote
"
+
Get Quote

+
Return to Dashboard
"

     reviewOrder: (task)->
       if task.fromLanguage is task.toLanguage
@@ -317,6 +318,10 @@
         @.addClass("disabled")
         verbalizeIt.dashboardHandler.drawDashboard()

+    displayDashboardButton: ->
+      $("#verbalizeit-caption-form").on "click", "#verbalizeit-display-dashboard", ->
+        verbalizeIt.dashboardHandler.drawDashboardWithoutAjax()
+
     selectFromLanguage: ->
       $("#verbalizeit-caption-form").on "change", "#verbalizeit-choose-from-language", ->
         $("#verbalizeit-language-options").html(


Changed default config.

Changed default config.

It was an old testing value.

--- config.coffee
+++ config.coffee
@@ -1,4 +1,4 @@
 module.exports =
 	port: 8080,
 	secret: 'test',
-	cookieSecret: 'hoverbear for gov'
+	cookieSecret: 'test'


Allow creation of outgoing integrations from bots

--- packages/rocketchat-integrations/server/methods/outgoing/addOutgoingIntegration.coffee
+++ packages/rocketchat-integrations/server/methods/outgoing/addOutgoingIntegration.coffee
@@ -1,6 +1,6 @@
 Meteor.methods
 	addOutgoingIntegration: (integration) ->
-		if not RocketChat.authz.hasPermission @userId, 'manage-integrations'
+		if not RocketChat.authz.hasPermission(@userId, 'manage-integrations') and not RocketChat.authz.hasPermission(@userId, 'manage-integrations', 'bot')
 			throw new Meteor.Error 'not_authorized'

 		if integration.username.trim() is ''


Bug Fix: Edit multiple stock count error

# How to reproduce:

in path: `/spree/admin/stock_items`, try to mark multiple stocks as `edit` state, and save one item

# What's Expected:

The edited item to be saved

# What's Happening:

Nothing changed

# Cause of issue
`$("input[name='count_on_hand']")` would select all the opened edit, and calling `$("input[name='count_on_hand']").val()` would return the value of the first value in the array only.

--- backend/app/assets/javascripts/spree/backend/stock_management/index_update_forms.coffee
+++ backend/app/assets/javascripts/spree/backend/stock_management/index_update_forms.coffee
@@ -46,7 +46,7 @@
   onSubmit: (ev) ->
     ev.preventDefault()
     backorderable = @$('[name=backorderable]').prop("checked")
-    countOnHand = parseInt($("input[name='count_on_hand']").val(), 10)
+    countOnHand = parseInt(@$("input[name='count_on_hand']").val(), 10)

     @model.set
       count_on_hand: countOnHand


Simplification

Simplification

--- rest_controller.coffee
+++ rest_controller.coffee
@@ -35,8 +35,7 @@

   create: (req, res) =>
     try
-      model = new @model_type()
-      model.set(model.parse(req.body))
+      model = new @model_type(@model_type::parse(req.body))
       model.save {}, {
         success: =>
           json = model.toJSON()


Fix typo

Fix typo

--- server/konnectors/googlecontacts.coffee
+++ server/konnectors/googlecontacts.coffee
@@ -103,8 +103,8 @@

 # Obtain a valid access_token : with auth_code on first launch,
 # else with the refresh_token.
-module.exports.updateToken = updateToken = (
-    (requiredFields, entries, data, callback) ->
+module.exports.updateToken = updateToken = (requiredFields,
+entries, data, callback) ->

     log.debug 'updateToken'

@@ -128,7 +128,6 @@

                 callback()
         )
-)

 # Fetch account name (email address of this google account) on first launch.