diff --git a/bower.json b/bower.json
index f1db29c1..cba4d2a0 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
{
"name": "typescript-dotnet",
- "version": "2.12.3",
+ "version": "2.13.0",
"ignore": [
".bowercc",
".gitignore",
diff --git a/dist/amd/System.Linq/Linq.d.ts b/dist/amd/System.Linq/Linq.d.ts
index 03d8c5c7..eb598fc4 100644
--- a/dist/amd/System.Linq/Linq.d.ts
+++ b/dist/amd/System.Linq/Linq.d.ts
@@ -1,19 +1,17 @@
-///
-///
-///
-///
-///
-///
-///
-///
-///
/*!
* @author electricessence / https://github.com/electricessence/
* Original: http://linqjs.codeplex.com/
* Licensing: MIT https://github.com/electricessence/TypeScript.NET/blob/master/LICENSE.md
*/
-import Dictionary from "../System/Collections/Dictionaries/Dictionary";
-import DisposableBase from "../System/Disposable/DisposableBase";
+import { Dictionary } from "../System/Collections/Dictionaries/Dictionary";
+import { DisposableBase } from "../System/Disposable/DisposableBase";
+import { IEnumerator } from "../System/Collections/Enumeration/IEnumerator";
+import { IEnumerable } from "../System/Collections/Enumeration/IEnumerable";
+import { Action, Predicate, Selector, EqualityComparison, Comparison } from "../System/FunctionTypes";
+import { IEnumerableOrArray } from "../System/Collections/IEnumerableOrArray";
+import { IArray } from "../System/Collections/Array/IArray";
+import { IMap } from "../System/Collections/Dictionaries/IDictionary";
+import { Comparable } from "../System/IComparable";
export declare const enum EnumerableAction {
Break = 0,
Return = 1,
diff --git a/dist/amd/System.Linq/Linq.js b/dist/amd/System.Linq/Linq.js
index a19837f4..99fd2f94 100644
--- a/dist/amd/System.Linq/Linq.js
+++ b/dist/amd/System.Linq/Linq.js
@@ -3,6 +3,6 @@
* Original: http://linqjs.codeplex.com/
* Licensing: MIT https://github.com/electricessence/TypeScript.NET/blob/master/LICENSE.md
*/
-var __extends=this&&this.__extends||function(t,e){function n(){this.constructor=t}for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)};define(["require","exports","../System/Compare","../System/Collections/Array/Compare","../System/Collections/Array/Utility","../System/Collections/Enumeration/Enumerator","../System/Types","../System/Integer","../System/Functions","../System/Collections/Enumeration/ArrayEnumerator","../System/Collections/Enumeration/EnumeratorBase","../System/Collections/Dictionaries/Dictionary","../System/Collections/Queue","../System/Disposable/dispose","../System/Disposable/DisposableBase","../System/Collections/Enumeration/UnsupportedEnumerableException","../System/Disposable/ObjectDisposedException","../System/Collections/Sorting/KeySortedContext","../System/Exceptions/ArgumentNullException","../System/Exceptions/ArgumentOutOfRangeException"],function(t,e,n,r,o,u,i,s,f,a,c,l,p,d,y,h,v,m,w,E){"use strict";function g(){return u.empty}function N(t,e){return e&&(e.moveNext()?t.enqueue(e):(d.dispose(e),e=null)),e}function _(t,e){void 0===e&&(e=null);var n=new m["default"](e,t.keySelector,t.order,t.comparer);return t.parent?_(t.parent,n):n}function x(t){if(t)throw new v["default"]("Enumerable")}var I={},D=void 0,b=function(t){return 0},R=function(t){function e(){t.apply(this,arguments)}return __extends(e,t),e.prototype.Greater=function(t,e){return t>e?t:e},e.prototype.Lesser=function(t,e){return e>t?t:e},e}(f["default"]),k=new R;Object.freeze(k);var A=function(t){function e(e,n){t.call(this,n),this._enumeratorFactory=e,this._isEndless=!0}return __extends(e,t),Object.defineProperty(e.prototype,"isEndless",{get:function(){return this._isEndless},enumerable:!0,configurable:!0}),e.prototype.getEnumerator=function(){return this.throwIfDisposed(),this._enumeratorFactory()},e.prototype._onDispose=function(){t.prototype._onDispose.call(this),this._enumeratorFactory=null},e.prototype.asEnumerable=function(){var t=this;return t.throwIfDisposed(),new e(function(){return t.getEnumerator()})},e.prototype.doAction=function(t,e,n){void 0===n&&(n=this.isEndless);var r=this,o=!r.throwIfDisposed();return new O(function(){var u,i=0;return new c["default"](function(){x(o),e&&e(),i=0,u=r.getEnumerator()},function(e){for(x(o);u.moveNext();){var n=t(u.current,i++);if(n===!1||0===n)return e.yieldBreak();if(2!==n)return e.yieldReturn(u.current)}return!1},function(){d.dispose(u)},n)},function(){o=!0},n)},e.prototype.force=function(){this.throwIfDisposed(),this.doAction(b).getEnumerator().moveNext()},e.prototype.skip=function(t){var e=this;return e.throwIfDisposed(),isFinite(t)?(s["default"].assert(t,"count"),this.doAction(function(e,n){return t>n?2:1})):O.empty()},e.prototype.take=function(t){if(!(t>0))return O.empty();var e=this;if(e.throwIfDisposed(),!isFinite(t))throw new E["default"]("count",t,"Must be finite.");return s["default"].assert(t,"count"),e.doAction(function(e,n){return t>n},null,!1)},e.prototype.elementAt=function(t){var e=this.elementAtOrDefault(t,I);if(e===I)throw new E["default"]("index",t,"is greater than or equal to the number of elements in source");return e},e.prototype.elementAtOrDefault=function(t,e){void 0===e&&(e=null);var n=this;n.throwIfDisposed(),s["default"].assertZeroOrGreater(t,"index");var r=t;return d.using(this.getEnumerator(),function(t){for(var n=0;t.moveNext();){if(n==r)return t.current;n++}return e})},e.prototype.first=function(){var t=this.firstOrDefault(I);if(t===I)throw new Error("first:The sequence is empty.");return t},e.prototype.firstOrDefault=function(t){void 0===t&&(t=null);var e=this;return e.throwIfDisposed(),d.using(this.getEnumerator(),function(e){return e.moveNext()?e.current:t})},e.prototype.single=function(){var t=this;return t.throwIfDisposed(),d.using(this.getEnumerator(),function(t){if(t.moveNext()){var e=t.current;if(!t.moveNext())return e;throw new Error("single:sequence contains more than one element.")}throw new Error("single:The sequence is empty.")})},e.prototype.singleOrDefault=function(t){void 0===t&&(t=null);var e=this;return e.throwIfDisposed(),d.using(this.getEnumerator(),function(e){if(e.moveNext()){var n=e.current;if(!e.moveNext())return n}return t})},e.prototype.any=function(){var t=this;return t.throwIfDisposed(),d.using(this.getEnumerator(),function(t){return t.moveNext()})},e.prototype.isEmpty=function(){return!this.any()},e.prototype.traverseBreadthFirst=function(t,e){void 0===e&&(e=k.Identity);var n=this,r=n._isEndless||null;return new O(function(){var o,u,i,s=0;return new c["default"](function(){s=0,u=[],i=0,o=n.getEnumerator()},function(n){for(;;){if(o.moveNext())return u[i++]=o.current,n.yieldReturn(e(o.current,s));if(!i)return n.yieldBreak();var r=O.from(u).selectMany(t);if(!r.any())return n.yieldBreak();s++,u=[],i=0,o.dispose(),o=r.getEnumerator()}},function(){d.dispose(o),u.length=0},r)},null,r)},e.prototype.traverseDepthFirst=function(t,e){void 0===e&&(e=k.Identity);var n=this,r=n._isEndless||null;return new O(function(){var o,i,s=[];return new c["default"](function(){o=n.getEnumerator(),i=0},function(n){for(;;){if(o.moveNext()){var r=e(o.current,i);s[i++]=o;var f=O.fromAny(t(o.current));return o=f?f.getEnumerator():u.empty,n.yieldReturn(r)}if(0==i)return!1;o.dispose(),o=s[--i],s.length=i}},function(){try{d.dispose(o)}finally{d.dispose.these(s)}},r)},null,r)},e.prototype.flatten=function(){var t=this,e=t._isEndless||null;return new O(function(){var n,r=null;return new c["default"](function(){n=t.getEnumerator()},function(t){for(;;){if(r){if(r.moveNext())return t.yieldReturn(r.current);r.dispose(),r=null}if(n.moveNext()){var e=n.current,o=!i["default"].isString(e)&&O.fromAny(e);if(o){r=o.selectMany(k.Identity).flatten().getEnumerator();continue}return t.yieldReturn(e)}return t.yieldBreak()}},function(){d.dispose(n,r)},e)},null,e)},e.prototype.pairwise=function(t){var e=this;return new O(function(){var n;return new c["default"](function(){n=e.getEnumerator(),n.moveNext()},function(e){var r=n.current;return n.moveNext()&&e.yieldReturn(t(r,n.current))},function(){d.dispose(n)},e._isEndless)},null,e._isEndless)},e.prototype.scan=function(t,e){var n=e!==D,r=this;return new O(function(){var o,u,i;return new c["default"](function(){o=r.getEnumerator(),i=!0},function(r){return i?(i=!1,n?r.yieldReturn(u=e):o.moveNext()&&r.yieldReturn(u=o.current)):o.moveNext()?r.yieldReturn(u=t(u,o.current)):!1},function(){d.dispose(o)},r._isEndless)},null,r._isEndless)},e.prototype.select=function(t){var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o=0;return new c["default"](function(){x(n),o=0,r=e.getEnumerator()},function(e){return x(n),r.moveNext()?e.yieldReturn(t(r.current,o++)):e.yieldBreak()},function(){d.dispose(r)},e._isEndless)},function(){n=!0},e._isEndless)},e.prototype._selectMany=function(t,e){var n=this,r=n._isEndless||null;return e||(e=function(t,e){return e}),new O(function(){var o,i,s=0;return new c["default"](function(){o=n.getEnumerator(),i=void 0,s=0},function(n){if(i===D&&!o.moveNext())return!1;do{if(!i){var r=t(o.current,s++);if(!r)continue;i=u.from(r)}if(i.moveNext())return n.yieldReturn(e(o.current,i.current));i.dispose(),i=null}while(o.moveNext());return!1},function(){d.dispose(o,i),o=null,i=null},r)},null,r)},e.prototype.selectMany=function(t,e){return this._selectMany(t,e)},e.prototype._choose=function(t){var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o=0;return new c["default"](function(){x(n),o=0,r=e.getEnumerator()},function(e){for(x(n);r.moveNext();){var u=t(r.current,o++);if(null!==u&&u!==D)return e.yieldReturn(u)}return!1},function(){d.dispose(r)},e._isEndless)},function(){n=!0},e._isEndless)},e.prototype.choose=function(t){return void 0===t&&(t=k.Identity),this._choose(t)},e.prototype.where=function(t){var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o=0;return new c["default"](function(){x(n),o=0,r=e.getEnumerator()},function(e){for(x(n);r.moveNext();)if(t(r.current,o++))return e.yieldReturn(r.current);return!1},function(){d.dispose(r)},e._isEndless)},function(){n=!0},e._isEndless)},e.prototype.ofType=function(t){var e;switch(t){case Number:e=i["default"].NUMBER;break;case String:e=i["default"].STRING;break;case Boolean:e=i["default"].BOOLEAN;break;case Function:e=i["default"].FUNCTION;break;default:return this.where(function(e){return e instanceof t})}return this.choose().where(function(t){return typeof t===e})},e.prototype.except=function(t,e){var n=this,r=!n.throwIfDisposed();return new O(function(){var o,i;return new c["default"](function(){x(r),o=n.getEnumerator(),i=new l["default"](e),t&&u.forEach(t,function(t){return i.addByKeyValue(t,!0)})},function(t){for(x(r);o.moveNext();){var e=o.current;if(!i.containsKey(e))return i.addByKeyValue(e,!0),t.yieldReturn(e)}return!1},function(){d.dispose(o),i.clear()},n._isEndless)},function(){r=!0},n._isEndless)},e.prototype.distinct=function(t){return this.except(null,t)},e.prototype.distinctUntilChanged=function(t){void 0===t&&(t=k.Identity);var e=this,r=!e.throwIfDisposed();return new O(function(){var o,u,i=!0;return new c["default"](function(){x(r),o=e.getEnumerator()},function(e){for(x(r);o.moveNext();){var s=t(o.current);if(i)i=!1;else if(n.areEqual(u,s))continue;return u=s,e.yieldReturn(o.current)}return!1},function(){d.dispose(o)},e._isEndless)},function(){r=!0},e._isEndless)},e.prototype.defaultIfEmpty=function(t){void 0===t&&(t=null);var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o;return new c["default"](function(){o=!0,x(n),r=e.getEnumerator()},function(e){return x(n),r.moveNext()?(o=!1,e.yieldReturn(r.current)):o?(o=!1,e.yieldReturn(t)):!1},function(){d.dispose(r)},e._isEndless)},null,e._isEndless)},e.prototype.zip=function(t,e){var n=this;return n.throwIfDisposed(),new O(function(){var r,o,i=0;return new c["default"](function(){i=0,r=n.getEnumerator(),o=u.from(t)},function(t){return r.moveNext()&&o.moveNext()&&t.yieldReturn(e(r.current,o.current,i++))},function(){d.dispose(r,o)})})},e.prototype.zipMultiple=function(t,e){var n=this;return n.throwIfDisposed(),t.length?new O(function(){var r,o,i,s=0;return new c["default"](function(){r=new p["default"](t),s=0,o=n.getEnumerator(),i=null},function(t){if(o.moveNext())for(;;){for(;!i;){if(!r.count)return t.yieldBreak();var n=r.dequeue();n&&(i=u.from(n))}if(i.moveNext())return t.yieldReturn(e(o.current,i.current,s++));i.dispose(),i=null}return t.yieldBreak()},function(){d.dispose(o,r)})}):O.empty()},e.prototype.join=function(t,e,n,r,o){void 0===o&&(o=k.Identity);var u=this;return new O(function(){var i,s,f=null,a=0;return new c["default"](function(){i=u.getEnumerator(),s=O.from(t).toLookup(n,k.Identity,o)},function(t){for(;;){if(null!=f){var n=f[a++];if(n!==D)return t.yieldReturn(r(i.current,n));n=null,a=0}if(!i.moveNext())return t.yieldBreak();var o=e(i.current);f=s.get(o)}},function(){d.dispose(i)})})},e.prototype.groupJoin=function(t,e,n,r,o){void 0===o&&(o=k.Identity);var u=this;return new O(function(){var i,s=null;return new c["default"](function(){i=u.getEnumerator(),s=O.from(t).toLookup(n,k.Identity,o)},function(t){return i.moveNext()&&t.yieldReturn(r(i.current,s.get(e(i.current))))},function(){d.dispose(i)})})},e.prototype.merge=function(t){var e=this,n=e._isEndless||null;return t&&0!=t.length?new O(function(){var r,o;return new c["default"](function(){r=e.getEnumerator(),o=new p["default"](t)},function(t){for(;;){for(;!r&&o.count;)r=u.from(o.dequeue());if(r&&r.moveNext())return t.yieldReturn(r.current);{if(!r)return t.yieldBreak();r.dispose(),r=null}}},function(){d.dispose(r,o)},n)},null,n):e},e.prototype.concat=function(){for(var t=[],e=0;et||!isFinite(t))throw new Error("Invalid buffer size.");s["default"].assert(t,"size");var e,n=this;return new O(function(){var r;return new c["default"](function(){r=n.getEnumerator()},function(n){var u=o.initialize(t);for(e=0;t>e&&r.moveNext();)u[e++]=r.current;return u.length=e,e&&n.yieldReturn(u)},function(){d.dispose(r)},n._isEndless)},null,n._isEndless)},e.prototype.share=function(){var t=this;t.throwIfDisposed();var e;return new O(function(){return e||(e=t.getEnumerator())},function(){d.dispose(e)},t._isEndless)},e}(y["default"]);e.InfiniteEnumerable=A;var O=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,e,n),this._isEndless=r}return __extends(e,t),e.from=function(t){var n=e.fromAny(t);if(!n)throw new h["default"];return n},e.fromAny=function(t,n){if(void 0===n&&(n=null),i["default"].isObject(t)||i["default"].isString(t)){if(t instanceof e)return t;if(i["default"].isArrayLike(t))return new S(t);if(u.isEnumerable(t))return new e(function(){return t.getEnumerator()},null,t.isEndless)}return n},e.fromOrEmpty=function(t){return e.fromAny(t)||e.empty()},e.toArray=function(t){return t instanceof e?t.toArray():u.toArray(t)},e.choice=function(t){var e=t&&t.length;if(!e||!isFinite(e))throw new E["default"]("length",length);return new A(function(){return new c["default"](null,function(e){return e.yieldReturn(s["default"].random.select(t))},!0)})},e.chooseFrom=function(){for(var t=[],n=0;n=t.length&&(e=0),n.yieldReturn(t[e++])},!0)})},e.cycleThrough=function(){for(var t=[],n=0;n0?isFinite(n)&&s["default"].assert(n,"count")?new B(function(){var e=n,r=0;return new c["default"](function(){r=0},function(n){return r++0))return e.empty();if(!r)throw new E["default"]("step",r,"Must be a valid value");if(!isFinite(r))throw new E["default"]("step",r,"Must be a finite number.");return s["default"].assert(n,"count"),new B(function(){var e,o=n,u=0;return new c["default"](function(){u=0,e=t},function(t){var i=u++u&&(e+=r),i},!1)})},e.rangeDown=function(t,n,r){return void 0===r&&(r=1),r=-1*Math.abs(r),e.range(t,n,r)},e.toInfinity=function(t,e){if(void 0===t&&(t=0),void 0===e&&(e=1),!isFinite(t))throw new E["default"]("start",t,"Must be a finite number.");if(!e)throw new E["default"]("step",e,"Must be a valid value");if(!isFinite(e))throw new E["default"]("step",e,"Must be a finite number.");return new A(function(){var n;return new c["default"](function(){n=t},function(t){var r=n;return n+=e,t.yieldReturn(r)},!0)})},e.toNegativeInfinity=function(t,n){return void 0===t&&(t=0),void 0===n&&(n=1),e.toInfinity(t,-n)},e.rangeTo=function(t,e,n){if(void 0===n&&(n=1),isNaN(e)||!isFinite(e))throw new E["default"]("to",e,"Must be a finite number.");if(n&&!isFinite(n))throw new E["default"]("step",n,"Must be a finite non-zero number.");return n=Math.abs(n),new B(function(){var r;return new c["default"](function(){r=t},e>t?function(t){var o=e>=r&&t.yieldReturn(r);return o&&(r+=n),o}:function(t){var o=r>=e&&t.yieldReturn(r);return o&&(r-=n),o},!1)})},e.matches=function(t,e,n){if(void 0===n&&(n=""),null===t||t===D)throw new w["default"]("input");var r=typeof t;if(r!=i["default"].STRING)throw new Error("Cannot exec RegExp matches of type '"+r+"'.");return e instanceof RegExp&&(n+=e.ignoreCase?"i":"",n+=e.multiline?"m":"",e=e.source),-1===n.indexOf("g")&&(n+="g"),new B(function(){var r;return new c["default"](function(){r=new RegExp(e,n)},function(e){var n=r.exec(t);return null!==n?e.yieldReturn(n):!1})})},e.generate=function(t,n){return void 0===n&&(n=1/0),isNaN(n)||0>=n?e.empty():isFinite(n)&&s["default"].assert(n,"count")?new B(function(){var e=n,r=0;return new c["default"](function(){r=0},function(n){var o=r++;return e>o&&n.yieldReturn(t(o))},!1)}):new A(function(){var e=0;return new c["default"](function(){e=0},function(n){return n.yieldReturn(t(e++))},!0)})},e.unfold=function(t,e,n){return void 0===n&&(n=!1),new A(function(){var r,o,u=0;return new c["default"](function(){u=0,r=t,o=!n},function(t){var n=u++;return o?o=!1:r=e(r,n),t.yieldReturn(r)},!0)})},e.forEach=function(t,e){u.forEach(t,e)},e.map=function(t,e){return u.map(t,e)},e.max=function(t){return t.takeUntil(function(t){return t==+(1/0)},!0).aggregate(k.Greater)},e.min=function(t){return t.takeUntil(function(t){return t==-(1/0)},!0).aggregate(k.Lesser)},e.weave=function(t){if(!t)throw new w["default"]("enumerables");return new e(function(){var e,n,r;return new c["default"](function(){r=0,e=new p["default"],n=u.from(t)},function(t){var r;if(n){for(;!r&&n.moveNext();){var o=n.current;r=N(e,o&&u.from(o))}r||(n=null)}for(;!r&&e.count;)r=N(e,e.dequeue());return r?t.yieldReturn(r.current):t.yieldBreak()},function(){d.dispose.these(e.dump()),d.dispose(n,e),n=null,e=null})})},e.prototype.doAction=function(e,n,r){return void 0===r&&(r=this.isEndless),t.prototype.doAction.call(this,e,n,r)},e.prototype.skip=function(e){return t.prototype.skip.call(this,e)},e.prototype.skipWhile=function(t){return this.throwIfDisposed(),this.doAction(function(e,n){return t(e,n)?2:1})},e.prototype.takeWhile=function(t){if(this.throwIfDisposed(),!t)throw new w["default"]("predicate");return this.doAction(function(e,n){return t(e,n)?1:0},null,null)},e.prototype.takeUntil=function(t,e){if(this.throwIfDisposed(),!t)throw new w["default"]("predicate");if(!e)return this.doAction(function(e,n){return t(e,n)?0:1},null,null);var n=!1;return this.doAction(function(e,r){return n?0:(n=t(e,r),1)},function(){n=!1},null)},e.prototype.forEach=function(t){var e=this;e.throwIfDisposed(),u.throwIfEndless(e.isEndless);var n=0;d.using(e.getEnumerator(),function(r){for(u.throwIfEndless(r.isEndless);e.throwIfDisposed()&&r.moveNext()&&t(r.current,n++)!==!1;);})},e.prototype.toArray=function(t){return t?this.where(t).toArray():this.copyTo([])},e.prototype.copyTo=function(t,e){if(void 0===e&&(e=0),this.throwIfDisposed(),!t)throw new w["default"]("target");return s["default"].assertZeroOrGreater(e),u.forEach(this,function(n,r){t[r+e]=n}),t},e.prototype.toLookup=function(t,e,n){void 0===e&&(e=k.Identity),void 0===n&&(n=k.Identity);var r=new l["default"](n);return this.forEach(function(n){var o=t(n),u=e(n),i=r.getValue(o);i!==D?i.push(u):r.addByKeyValue(o,[u])}),new q(r)},e.prototype.toMap=function(t,e){var n={};return this.forEach(function(r,o){n[t(r,o)]=e(r,o)}),n},e.prototype.toDictionary=function(t,e,n){void 0===n&&(n=k.Identity);var r=new l["default"](n);return this.forEach(function(n,o){return r.addByKeyValue(t(n,o),e(n,o))}),r},e.prototype.toJoinedString=function(t,e){return void 0===t&&(t=""),void 0===e&&(e=k.Identity),this.select(e).toArray().join(t)},e.prototype.takeExceptLast=function(t){void 0===t&&(t=1);var n=this;if(!(t>0))return n;if(!isFinite(t))return e.empty();s["default"].assert(t,"count");var r=t;return new e(function(){var t,e;return new c["default"](function(){t=n.getEnumerator(),e=new p["default"]},function(n){for(;t.moveNext();)if(e.enqueue(t.current),e.count>r)return n.yieldReturn(e.dequeue());return!1},function(){d.dispose(t,e)})})},e.prototype.skipToLast=function(t){if(!(t>0))return e.empty();var n=this;return isFinite(t)?(s["default"].assert(t,"count"),n.reverse().take(t).reverse()):n},e.prototype.where=function(e){return t.prototype.where.call(this,e)},e.prototype.select=function(e){return t.prototype.select.call(this,e)},e.prototype.selectMany=function(t,e){return this._selectMany(t,e)},e.prototype.choose=function(t){return void 0===t&&(t=k.Identity),this._choose(t)},e.prototype.reverse=function(){var t=this,n=!t.throwIfDisposed();return u.throwIfEndless(t._isEndless),new e(function(){var e,r=0;return new c["default"](function(){x(n),e=t.toArray(),r=e.length},function(t){return r&&t.yieldReturn(e[--r])},function(){e.length=0})},function(){n=!0})},e.prototype.shuffle=function(){var t=this,n=!t.throwIfDisposed();return u.throwIfEndless(t._isEndless),new e(function(){var e,r,o;return new c["default"](function(){x(n),e=t.toArray(),r=o=e.length},function(t){if(!o)return t.yieldBreak();var n=s["default"].random(o),r=e[n];return e[n]=e[--o],e[o]=null,o%32==0&&(e.length=o),t.yieldReturn(r)},function(){e.length=0})},function(){n=!0})},e.prototype.count=function(t){var e=0;return this.forEach(t?function(n,r){t(n,r)&&++e}:function(){++e}),e},e.prototype.all=function(t){if(!t)throw new w["default"]("predicate");var e=!0;return this.forEach(function(n,r){return t(n,r)?void 0:(e=!1,!1)}),e},e.prototype.every=function(t){return this.all(t)},e.prototype.any=function(e){if(!e)return t.prototype.any.call(this);var n=!1;return this.forEach(function(t,r){return n=e(t,r),!n}),n},e.prototype.some=function(t){return this.any(t)},e.prototype.contains=function(t,e){return e?this.any(function(n){return e(n)===e(t)}):this.any(function(e){return e===t})},e.prototype.indexOf=function(t,e){var r=-1;return this.forEach(e?function(o,u){return n.areEqual(e(o,u),e(t,u),!0)?(r=u,!1):void 0}:function(e,o){return n.areEqual(e,t,!0)?(r=o,!1):void 0}),r},e.prototype.lastIndexOf=function(t,e){var r=-1;return this.forEach(e?function(o,u){n.areEqual(e(o,u),e(t,u),!0)&&(r=u)}:function(e,o){n.areEqual(e,t,!0)&&(r=o)}),r},e.prototype.merge=function(e){return t.prototype.merge.call(this,e)},e.prototype.concat=function(){for(var t=[],e=0;et(n)?e:n})},e.prototype.minBy=function(t){return void 0===t&&(t=k.Identity),this.aggregate(function(e,n){return t(e)0?1:-1)}),isNaN(e)?NaN:n?n*(1/0):e},e.prototype.product=function(t){void 0===t&&(t=i["default"].numberOrNaN);var e=1,n=!1;return this.forEach(function(r,o){n=!0;var u=t(r,o);return isNaN(u)?(e=NaN,!1):0==u?(e=0,!1):void(e*=u)}),n&&isNaN(e)?NaN:e},e.prototype.quotient=function(t){void 0===t&&(t=i["default"].numberOrNaN);var e=0,n=NaN;return this.forEach(function(r,o){var u=t(r,o);if(e++,1===e)n=u;else{if(isNaN(u)||0===u||!isFinite(u))return n=NaN,!1;n/=u}}),1===e&&(n=NaN),n},e.prototype.last=function(){var t=this;t.throwIfDisposed();var e=void 0,n=!1;if(t.forEach(function(t){n=!0,e=t}),!n)throw new Error("last:No element satisfies the condition.");return e},e.prototype.lastOrDefault=function(t){void 0===t&&(t=null);var e=this;e.throwIfDisposed();var n=void 0,r=!1;return e.forEach(function(t){r=!0,n=t}),r?n:t},e.prototype.share=function(){return t.prototype.share.call(this)},e.prototype.catchError=function(e){return t.prototype.catchError.call(this,e)},e.prototype.finallyAction=function(e){return t.prototype.finallyAction.call(this,e)},e.prototype.memoize=function(){var t,n,r=this,o=!r.throwIfDisposed();return new e(function(){var e=0;return new c["default"](function(){x(o),n||(n=r.getEnumerator()),t||(t=[]),e=0},function(r){x(o);var u=e++;return u>=t.length?n.moveNext()?r.yieldReturn(t[u]=n.current):!1:r.yieldReturn(t[u])})},function(){o=!0,t&&(t.length=0),t=null,d.dispose(n),n=null})},e}(A);e.Enumerable=O;var B=function(t){function e(e,n){t.call(this,e,n,!1)}return __extends(e,t),e}(O);e.FiniteEnumerable=B;var S=function(t){function e(e){t.call(this,function(){return n.throwIfDisposed(),new a["default"](function(){return n.throwIfDisposed("The underlying ArrayEnumerable was disposed.","ArrayEnumerator"),n._source})});var n=this;n._disposableObjectName="ArrayEnumerable",n._source=e}return __extends(e,t),e.prototype._onDispose=function(){t.prototype._onDispose.call(this),this._source=null},Object.defineProperty(e.prototype,"source",{get:function(){return this._source},enumerable:!0,configurable:!0}),e.prototype.toArray=function(){var t=this;return t.throwIfDisposed(),u.toArray(t._source)},e.prototype.asEnumerable=function(){return new e(this._source)},e.prototype.forEach=function(t){var e=this;e.throwIfDisposed(),u.forEach(e._source,t)},e.prototype.any=function(e){var n=this;n.throwIfDisposed();var r=n._source,o=r.length;return o&&(!e||t.prototype.any.call(this,e))},e.prototype.count=function(e){var n=this;n.throwIfDisposed();var r=n._source,o=r.length;return o&&(e?t.prototype.count.call(this,e):o)},e.prototype.elementAtOrDefault=function(t,e){void 0===e&&(e=null);var n=this;n.throwIfDisposed(),s["default"].assertZeroOrGreater(t,"index");var r=n._source;return t0?new O(function(){return new a["default"](function(){return e._source},t)}):e},e.prototype.takeExceptLast=function(t){void 0===t&&(t=1);var e=this;return e.take(e._source.length-t)},e.prototype.skipToLast=function(t){if(!(t>0))return O.empty();var e=this;if(!isFinite(t))return e;var n=e._source?e._source.length:0;return e.skip(n-t)},e.prototype.reverse=function(){var t=this;return new O(function(){return new a["default"](function(){return t._source},t._source?t._source.length-1:0,-1)})},e.prototype.memoize=function(){return this.asEnumerable()},e.prototype.sequenceEqual=function(o,u){return void 0===u&&(u=n.areEqual),i["default"].isArrayLike(o)?r.areEqual(this.source,o,!0,u):o instanceof e?o.sequenceEqual(this.source,u):t.prototype.sequenceEqual.call(this,o,u)},e.prototype.toJoinedString=function(e,n){void 0===e&&(e=""),void 0===n&&(n=k.Identity);var r=this._source;return!n&&Array.isArray(r)?r.join(e):t.prototype.toJoinedString.call(this,e,n)},e}(B),F=function(t){function e(e,n){t.call(this,n),this._groupKey=e}return __extends(e,t),Object.defineProperty(e.prototype,"key",{get:function(){return this._groupKey},enumerable:!0,configurable:!0}),e}(S),q=function(){function t(t){this._dictionary=t}return Object.defineProperty(t.prototype,"count",{get:function(){return this._dictionary.count},enumerable:!0,configurable:!0}),t.prototype.get=function(t){return this._dictionary.getValue(t)},t.prototype.contains=function(t){return this._dictionary.containsKey(t)},t.prototype.getEnumerator=function(){var t,e=this;return new c["default"](function(){t=e._dictionary.getEnumerator()},function(e){if(!t.moveNext())return!1;var n=t.current;return e.yieldReturn(new F(n.key,n.value))},function(){d.dispose(t)})},t}(),M=function(t){function e(e,r,o,i,s){void 0===s&&(s=n.compare),t.call(this,null),this.source=e,this.keySelector=r,this.order=o,this.parent=i,this.comparer=s,u.throwIfEndless(e&&e.isEndless);
-}return __extends(e,t),e.prototype.createOrderedEnumerable=function(t,n){return new e(this.source,t,n,this)},e.prototype.thenBy=function(t){return this.createOrderedEnumerable(t,1)},e.prototype.thenUsing=function(t){return new e(this.source,null,1,this,t)},e.prototype.thenByDescending=function(t){return this.createOrderedEnumerable(t,-1)},e.prototype.thenUsingReversed=function(t){return new e(this.source,null,-1,this,t)},e.prototype.getEnumerator=function(){var t,e,n=this,r=0;return new c["default"](function(){r=0,t=O.toArray(n.source),e=_(n).generateSortedIndexes(t)},function(n){return re?t:e},e.prototype.Lesser=function(t,e){return e>t?t:e},e}(a.Functions),b=new R;Object.freeze(b);var A=function(t){function e(e,n){t.call(this,n),this._enumeratorFactory=e,this._isEndless=!0}return __extends(e,t),Object.defineProperty(e.prototype,"isEndless",{get:function(){return this._isEndless},enumerable:!0,configurable:!0}),e.prototype.getEnumerator=function(){return this.throwIfDisposed(),this._enumeratorFactory()},e.prototype._onDispose=function(){t.prototype._onDispose.call(this),this._enumeratorFactory=null},e.prototype.asEnumerable=function(){var t=this;return t.throwIfDisposed(),new e(function(){return t.getEnumerator()})},e.prototype.doAction=function(t,e,n){void 0===n&&(n=this.isEndless);var r=this,o=!r.throwIfDisposed();return new O(function(){var i,u=0;return new f.EnumeratorBase(function(){I(o),e&&e(),u=0,i=r.getEnumerator()},function(e){for(I(o);i.moveNext();){var n=t(i.current,u++);if(n===!1||0===n)return e.yieldBreak();if(2!==n)return e.yieldReturn(i.current)}return!1},function(){y.dispose(i)},n)},function(){o=!0},n)},e.prototype.force=function(){this.throwIfDisposed(),this.doAction(D).getEnumerator().moveNext()},e.prototype.skip=function(t){var e=this;return e.throwIfDisposed(),isFinite(t)?(s.Integer.assert(t,"count"),this.doAction(function(e,n){return t>n?2:1})):O.empty()},e.prototype.take=function(t){if(!(t>0))return O.empty();var e=this;if(e.throwIfDisposed(),!isFinite(t))throw new w.ArgumentOutOfRangeException("count",t,"Must be finite.");return s.Integer.assert(t,"count"),e.doAction(function(e,n){return t>n},null,!1)},e.prototype.elementAt=function(t){var e=this.elementAtOrDefault(t,_);if(e===_)throw new w.ArgumentOutOfRangeException("index",t,"is greater than or equal to the number of elements in source");return e},e.prototype.elementAtOrDefault=function(t,e){void 0===e&&(e=null);var n=this;n.throwIfDisposed(),s.Integer.assertZeroOrGreater(t,"index");var r=t;return y.using(this.getEnumerator(),function(t){for(var n=0;t.moveNext();){if(n==r)return t.current;n++}return e})},e.prototype.first=function(){var t=this.firstOrDefault(_);if(t===_)throw new Error("first:The sequence is empty.");return t},e.prototype.firstOrDefault=function(t){void 0===t&&(t=null);var e=this;return e.throwIfDisposed(),y.using(this.getEnumerator(),function(e){return e.moveNext()?e.current:t})},e.prototype.single=function(){var t=this;return t.throwIfDisposed(),y.using(this.getEnumerator(),function(t){if(t.moveNext()){var e=t.current;if(!t.moveNext())return e;throw new Error("single:sequence contains more than one element.")}throw new Error("single:The sequence is empty.")})},e.prototype.singleOrDefault=function(t){void 0===t&&(t=null);var e=this;return e.throwIfDisposed(),y.using(this.getEnumerator(),function(e){if(e.moveNext()){var n=e.current;if(!e.moveNext())return n}return t})},e.prototype.any=function(){var t=this;return t.throwIfDisposed(),y.using(this.getEnumerator(),function(t){return t.moveNext()})},e.prototype.isEmpty=function(){return!this.any()},e.prototype.traverseBreadthFirst=function(t,e){void 0===e&&(e=b.Identity);var n=this,r=n._isEndless||null;return new O(function(){var o,i,u,s=0;return new f.EnumeratorBase(function(){s=0,i=[],u=0,o=n.getEnumerator()},function(n){for(;;){if(o.moveNext())return i[u++]=o.current,n.yieldReturn(e(o.current,s));if(!u)return n.yieldBreak();var r=O.from(i).selectMany(t);if(!r.any())return n.yieldBreak();s++,i=[],u=0,o.dispose(),o=r.getEnumerator()}},function(){y.dispose(o),i.length=0},r)},null,r)},e.prototype.traverseDepthFirst=function(t,e){void 0===e&&(e=b.Identity);var n=this,r=n._isEndless||null;return new O(function(){var o,u,s=[];return new f.EnumeratorBase(function(){o=n.getEnumerator(),u=0},function(n){for(;;){if(o.moveNext()){var r=e(o.current,u);s[u++]=o;var a=O.fromAny(t(o.current));return o=a?a.getEnumerator():i.empty,n.yieldReturn(r)}if(0==u)return!1;o.dispose(),o=s[--u],s.length=u}},function(){try{y.dispose(o)}finally{y.dispose.these(s)}},r)},null,r)},e.prototype.flatten=function(){var t=this,e=t._isEndless||null;return new O(function(){var n,r=null;return new f.EnumeratorBase(function(){n=t.getEnumerator()},function(t){for(;;){if(r){if(r.moveNext())return t.yieldReturn(r.current);r.dispose(),r=null}if(n.moveNext()){var e=n.current,o=!u.Type.isString(e)&&O.fromAny(e);if(o){r=o.selectMany(b.Identity).flatten().getEnumerator();continue}return t.yieldReturn(e)}return t.yieldBreak()}},function(){y.dispose(n,r)},e)},null,e)},e.prototype.pairwise=function(t){var e=this;return new O(function(){var n;return new f.EnumeratorBase(function(){n=e.getEnumerator(),n.moveNext()},function(e){var r=n.current;return n.moveNext()&&e.yieldReturn(t(r,n.current))},function(){y.dispose(n)},e._isEndless)},null,e._isEndless)},e.prototype.scan=function(t,e){var n=e!==B,r=this;return new O(function(){var o,i,u;return new f.EnumeratorBase(function(){o=r.getEnumerator(),u=!0},function(r){return u?(u=!1,n?r.yieldReturn(i=e):o.moveNext()&&r.yieldReturn(i=o.current)):o.moveNext()?r.yieldReturn(i=t(i,o.current)):!1},function(){y.dispose(o)},r._isEndless)},null,r._isEndless)},e.prototype.select=function(t){var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o=0;return new f.EnumeratorBase(function(){I(n),o=0,r=e.getEnumerator()},function(e){return I(n),r.moveNext()?e.yieldReturn(t(r.current,o++)):e.yieldBreak()},function(){y.dispose(r)},e._isEndless)},function(){n=!0},e._isEndless)},e.prototype._selectMany=function(t,e){var n=this,r=n._isEndless||null;return e||(e=function(t,e){return e}),new O(function(){var o,u,s=0;return new f.EnumeratorBase(function(){o=n.getEnumerator(),u=void 0,s=0},function(n){if(u===B&&!o.moveNext())return!1;do{if(!u){var r=t(o.current,s++);if(!r)continue;u=i.from(r)}if(u.moveNext())return n.yieldReturn(e(o.current,u.current));u.dispose(),u=null}while(o.moveNext());return!1},function(){y.dispose(o,u),o=null,u=null},r)},null,r)},e.prototype.selectMany=function(t,e){return this._selectMany(t,e)},e.prototype._choose=function(t){var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o=0;return new f.EnumeratorBase(function(){I(n),o=0,r=e.getEnumerator()},function(e){for(I(n);r.moveNext();){var i=t(r.current,o++);if(null!==i&&i!==B)return e.yieldReturn(i)}return!1},function(){y.dispose(r)},e._isEndless)},function(){n=!0},e._isEndless)},e.prototype.choose=function(t){return void 0===t&&(t=b.Identity),this._choose(t)},e.prototype.where=function(t){var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o=0;return new f.EnumeratorBase(function(){I(n),o=0,r=e.getEnumerator()},function(e){for(I(n);r.moveNext();)if(t(r.current,o++))return e.yieldReturn(r.current);return!1},function(){y.dispose(r)},e._isEndless)},function(){n=!0},e._isEndless)},e.prototype.ofType=function(t){var e;switch(t){case Number:e=u.Type.NUMBER;break;case String:e=u.Type.STRING;break;case Boolean:e=u.Type.BOOLEAN;break;case Function:e=u.Type.FUNCTION;break;default:return this.where(function(e){return e instanceof t})}return this.choose().where(function(t){return typeof t===e})},e.prototype.except=function(t,e){var n=this,r=!n.throwIfDisposed();return new O(function(){var o,u;return new f.EnumeratorBase(function(){I(r),o=n.getEnumerator(),u=new l.Dictionary(e),t&&i.forEach(t,function(t){return u.addByKeyValue(t,!0)})},function(t){for(I(r);o.moveNext();){var e=o.current;if(!u.containsKey(e))return u.addByKeyValue(e,!0),t.yieldReturn(e)}return!1},function(){y.dispose(o),u.clear()},n._isEndless)},function(){r=!0},n._isEndless)},e.prototype.distinct=function(t){return this.except(null,t)},e.prototype.distinctUntilChanged=function(t){void 0===t&&(t=b.Identity);var e=this,r=!e.throwIfDisposed();return new O(function(){var o,i,u=!0;return new f.EnumeratorBase(function(){I(r),o=e.getEnumerator()},function(e){for(I(r);o.moveNext();){var s=t(o.current);if(u)u=!1;else if(n.areEqual(i,s))continue;return i=s,e.yieldReturn(o.current)}return!1},function(){y.dispose(o)},e._isEndless)},function(){r=!0},e._isEndless)},e.prototype.defaultIfEmpty=function(t){void 0===t&&(t=null);var e=this,n=!e.throwIfDisposed();return new O(function(){var r,o;return new f.EnumeratorBase(function(){o=!0,I(n),r=e.getEnumerator()},function(e){return I(n),r.moveNext()?(o=!1,e.yieldReturn(r.current)):o?(o=!1,e.yieldReturn(t)):!1},function(){y.dispose(r)},e._isEndless)},null,e._isEndless)},e.prototype.zip=function(t,e){var n=this;return n.throwIfDisposed(),new O(function(){var r,o,u=0;return new f.EnumeratorBase(function(){u=0,r=n.getEnumerator(),o=i.from(t)},function(t){return r.moveNext()&&o.moveNext()&&t.yieldReturn(e(r.current,o.current,u++))},function(){y.dispose(r,o)})})},e.prototype.zipMultiple=function(t,e){var n=this;return n.throwIfDisposed(),t.length?new O(function(){var r,o,u,s=0;return new f.EnumeratorBase(function(){r=new p.Queue(t),s=0,o=n.getEnumerator(),u=null},function(t){if(o.moveNext())for(;;){for(;!u;){if(!r.count)return t.yieldBreak();var n=r.dequeue();n&&(u=i.from(n))}if(u.moveNext())return t.yieldReturn(e(o.current,u.current,s++));u.dispose(),u=null}return t.yieldBreak()},function(){y.dispose(o,r)})}):O.empty()},e.prototype.join=function(t,e,n,r,o){void 0===o&&(o=b.Identity);var i=this;return new O(function(){var u,s,a=null,c=0;return new f.EnumeratorBase(function(){u=i.getEnumerator(),s=O.from(t).toLookup(n,b.Identity,o)},function(t){for(;;){if(null!=a){var n=a[c++];if(n!==B)return t.yieldReturn(r(u.current,n));n=null,c=0}if(!u.moveNext())return t.yieldBreak();var o=e(u.current);a=s.get(o)}},function(){y.dispose(u)})})},e.prototype.groupJoin=function(t,e,n,r,o){void 0===o&&(o=b.Identity);var i=this;return new O(function(){var u,s=null;return new f.EnumeratorBase(function(){u=i.getEnumerator(),s=O.from(t).toLookup(n,b.Identity,o)},function(t){return u.moveNext()&&t.yieldReturn(r(u.current,s.get(e(u.current))))},function(){y.dispose(u)})})},e.prototype.merge=function(t){var e=this,n=e._isEndless||null;return t&&0!=t.length?new O(function(){var r,o;return new f.EnumeratorBase(function(){r=e.getEnumerator(),o=new p.Queue(t)},function(t){for(;;){for(;!r&&o.count;)r=i.from(o.dequeue());if(r&&r.moveNext())return t.yieldReturn(r.current);{if(!r)return t.yieldBreak();r.dispose(),r=null}}},function(){y.dispose(r,o)},n)},null,n):e},e.prototype.concat=function(){for(var t=[],e=0;et||!isFinite(t))throw new Error("Invalid buffer size.");s.Integer.assert(t,"size");var e,n=this;return new O(function(){var r;return new f.EnumeratorBase(function(){r=n.getEnumerator()},function(n){var i=o.initialize(t);for(e=0;t>e&&r.moveNext();)i[e++]=r.current;return i.length=e,e&&n.yieldReturn(i)},function(){y.dispose(r)},n._isEndless)},null,n._isEndless)},e.prototype.share=function(){var t=this;t.throwIfDisposed();var e;return new O(function(){return e||(e=t.getEnumerator())},function(){y.dispose(e)},t._isEndless)},e}(d.DisposableBase);e.InfiniteEnumerable=A;var O=function(t){function e(e,n,r){void 0===r&&(r=null),t.call(this,e,n),this._isEndless=r}return __extends(e,t),e.from=function(t){var n=e.fromAny(t);if(!n)throw new h.UnsupportedEnumerableException;return n},e.fromAny=function(t,n){if(void 0===n&&(n=null),u.Type.isObject(t)||u.Type.isString(t)){if(t instanceof e)return t;if(u.Type.isArrayLike(t))return new S(t);if(i.isEnumerable(t))return new e(function(){return t.getEnumerator()},null,t.isEndless)}return n},e.fromOrEmpty=function(t){return e.fromAny(t)||e.empty()},e.toArray=function(t){return t instanceof e?t.toArray():i.toArray(t)},e.choice=function(t){var e=t&&t.length;if(!e||!isFinite(e))throw new w.ArgumentOutOfRangeException("length",length);return new A(function(){return new f.EnumeratorBase(null,function(e){return e.yieldReturn(s.Integer.random.select(t))},!0)})},e.chooseFrom=function(){for(var t=[],n=0;n=t.length&&(e=0),n.yieldReturn(t[e++])},!0)})},e.cycleThrough=function(){for(var t=[],n=0;n0?isFinite(n)&&s.Integer.assert(n,"count")?new k(function(){var e=n,r=0;return new f.EnumeratorBase(function(){r=0},function(n){return r++0))return e.empty();if(!r)throw new w.ArgumentOutOfRangeException("step",r,"Must be a valid value");if(!isFinite(r))throw new w.ArgumentOutOfRangeException("step",r,"Must be a finite number.");return s.Integer.assert(n,"count"),new k(function(){var e,o=n,i=0;return new f.EnumeratorBase(function(){i=0,e=t},function(t){var u=i++i&&(e+=r),u},!1)})},e.rangeDown=function(t,n,r){return void 0===r&&(r=1),r=-1*Math.abs(r),e.range(t,n,r)},e.toInfinity=function(t,e){if(void 0===t&&(t=0),void 0===e&&(e=1),!isFinite(t))throw new w.ArgumentOutOfRangeException("start",t,"Must be a finite number.");if(!e)throw new w.ArgumentOutOfRangeException("step",e,"Must be a valid value");if(!isFinite(e))throw new w.ArgumentOutOfRangeException("step",e,"Must be a finite number.");return new A(function(){var n;return new f.EnumeratorBase(function(){n=t},function(t){var r=n;return n+=e,t.yieldReturn(r)},!0)})},e.toNegativeInfinity=function(t,n){return void 0===t&&(t=0),void 0===n&&(n=1),e.toInfinity(t,-n)},e.rangeTo=function(t,e,n){if(void 0===n&&(n=1),isNaN(e)||!isFinite(e))throw new w.ArgumentOutOfRangeException("to",e,"Must be a finite number.");if(n&&!isFinite(n))throw new w.ArgumentOutOfRangeException("step",n,"Must be a finite non-zero number.");return n=Math.abs(n),new k(function(){var r;return new f.EnumeratorBase(function(){r=t},e>t?function(t){var o=e>=r&&t.yieldReturn(r);return o&&(r+=n),o}:function(t){var o=r>=e&&t.yieldReturn(r);return o&&(r-=n),o},!1)})},e.matches=function(t,e,n){if(void 0===n&&(n=""),null===t||t===B)throw new E.ArgumentNullException("input");var r=typeof t;if(r!=u.Type.STRING)throw new Error("Cannot exec RegExp matches of type '"+r+"'.");return e instanceof RegExp&&(n+=e.ignoreCase?"i":"",n+=e.multiline?"m":"",e=e.source),-1===n.indexOf("g")&&(n+="g"),new k(function(){var r;return new f.EnumeratorBase(function(){r=new RegExp(e,n)},function(e){var n=r.exec(t);return null!==n?e.yieldReturn(n):!1})})},e.generate=function(t,n){return void 0===n&&(n=1/0),isNaN(n)||0>=n?e.empty():isFinite(n)&&s.Integer.assert(n,"count")?new k(function(){var e=n,r=0;return new f.EnumeratorBase(function(){r=0},function(n){var o=r++;return e>o&&n.yieldReturn(t(o))},!1)}):new A(function(){var e=0;return new f.EnumeratorBase(function(){e=0},function(n){return n.yieldReturn(t(e++))},!0)})},e.unfold=function(t,e,n){return void 0===n&&(n=!1),new A(function(){var r,o,i=0;return new f.EnumeratorBase(function(){i=0,r=t,o=!n},function(t){var n=i++;return o?o=!1:r=e(r,n),t.yieldReturn(r)},!0)})},e.forEach=function(t,e){i.forEach(t,e)},e.map=function(t,e){return i.map(t,e)},e.max=function(t){return t.takeUntil(function(t){return t==+(1/0)},!0).aggregate(b.Greater)},e.min=function(t){return t.takeUntil(function(t){return t==-(1/0)},!0).aggregate(b.Lesser)},e.weave=function(t){if(!t)throw new E.ArgumentNullException("enumerables");return new e(function(){var e,n,r;return new f.EnumeratorBase(function(){r=0,e=new p.Queue,n=i.from(t)},function(t){var r;if(n){for(;!r&&n.moveNext();){var o=n.current;r=x(e,o&&i.from(o))}r||(n=null)}for(;!r&&e.count;)r=x(e,e.dequeue());return r?t.yieldReturn(r.current):t.yieldBreak()},function(){y.dispose.these(e.dump()),y.dispose(n,e),n=null,e=null})})},e.prototype.doAction=function(e,n,r){return void 0===r&&(r=this.isEndless),t.prototype.doAction.call(this,e,n,r)},e.prototype.skip=function(e){return t.prototype.skip.call(this,e)},e.prototype.skipWhile=function(t){return this.throwIfDisposed(),this.doAction(function(e,n){return t(e,n)?2:1})},e.prototype.takeWhile=function(t){if(this.throwIfDisposed(),!t)throw new E.ArgumentNullException("predicate");return this.doAction(function(e,n){return t(e,n)?1:0},null,null)},e.prototype.takeUntil=function(t,e){if(this.throwIfDisposed(),!t)throw new E.ArgumentNullException("predicate");if(!e)return this.doAction(function(e,n){return t(e,n)?0:1},null,null);var n=!1;return this.doAction(function(e,r){return n?0:(n=t(e,r),1)},function(){n=!1},null)},e.prototype.forEach=function(t){var e=this;e.throwIfDisposed(),i.throwIfEndless(e.isEndless);var n=0;y.using(e.getEnumerator(),function(r){for(i.throwIfEndless(r.isEndless);e.throwIfDisposed()&&r.moveNext()&&t(r.current,n++)!==!1;);})},e.prototype.toArray=function(t){return t?this.where(t).toArray():this.copyTo([])},e.prototype.copyTo=function(t,e){if(void 0===e&&(e=0),this.throwIfDisposed(),!t)throw new E.ArgumentNullException("target");return s.Integer.assertZeroOrGreater(e),i.forEach(this,function(n,r){t[r+e]=n}),t},e.prototype.toLookup=function(t,e,n){void 0===e&&(e=b.Identity),void 0===n&&(n=b.Identity);var r=new l.Dictionary(n);return this.forEach(function(n){var o=t(n),i=e(n),u=r.getValue(o);u!==B?u.push(i):r.addByKeyValue(o,[i])}),new T(r)},e.prototype.toMap=function(t,e){var n={};return this.forEach(function(r,o){n[t(r,o)]=e(r,o)}),n},e.prototype.toDictionary=function(t,e,n){void 0===n&&(n=b.Identity);var r=new l.Dictionary(n);return this.forEach(function(n,o){return r.addByKeyValue(t(n,o),e(n,o))}),r},e.prototype.toJoinedString=function(t,e){return void 0===t&&(t=""),void 0===e&&(e=b.Identity),this.select(e).toArray().join(t)},e.prototype.takeExceptLast=function(t){void 0===t&&(t=1);var n=this;if(!(t>0))return n;if(!isFinite(t))return e.empty();s.Integer.assert(t,"count");var r=t;return new e(function(){var t,e;return new f.EnumeratorBase(function(){t=n.getEnumerator(),e=new p.Queue},function(n){for(;t.moveNext();)if(e.enqueue(t.current),e.count>r)return n.yieldReturn(e.dequeue());return!1},function(){y.dispose(t,e)})})},e.prototype.skipToLast=function(t){if(!(t>0))return e.empty();var n=this;return isFinite(t)?(s.Integer.assert(t,"count"),n.reverse().take(t).reverse()):n},e.prototype.where=function(e){return t.prototype.where.call(this,e)},e.prototype.select=function(e){return t.prototype.select.call(this,e)},e.prototype.selectMany=function(t,e){return this._selectMany(t,e)},e.prototype.choose=function(t){return void 0===t&&(t=b.Identity),this._choose(t)},e.prototype.reverse=function(){var t=this,n=!t.throwIfDisposed();return i.throwIfEndless(t._isEndless),new e(function(){var e,r=0;return new f.EnumeratorBase(function(){I(n),e=t.toArray(),r=e.length},function(t){return r&&t.yieldReturn(e[--r])},function(){e.length=0})},function(){n=!0})},e.prototype.shuffle=function(){var t=this,n=!t.throwIfDisposed();return i.throwIfEndless(t._isEndless),new e(function(){var e,r,o;return new f.EnumeratorBase(function(){I(n),e=t.toArray(),r=o=e.length},function(t){if(!o)return t.yieldBreak();var n=s.Integer.random(o),r=e[n];return e[n]=e[--o],e[o]=null,o%32==0&&(e.length=o),t.yieldReturn(r)},function(){e.length=0})},function(){n=!0})},e.prototype.count=function(t){var e=0;return this.forEach(t?function(n,r){t(n,r)&&++e}:function(){++e}),e},e.prototype.all=function(t){if(!t)throw new E.ArgumentNullException("predicate");var e=!0;return this.forEach(function(n,r){return t(n,r)?void 0:(e=!1,!1)}),e},e.prototype.every=function(t){return this.all(t)},e.prototype.any=function(e){if(!e)return t.prototype.any.call(this);var n=!1;return this.forEach(function(t,r){return n=e(t,r),!n}),n},e.prototype.some=function(t){return this.any(t)},e.prototype.contains=function(t,e){return e?this.any(function(n){return e(n)===e(t)}):this.any(function(e){return e===t})},e.prototype.indexOf=function(t,e){var r=-1;return this.forEach(e?function(o,i){return n.areEqual(e(o,i),e(t,i),!0)?(r=i,!1):void 0}:function(e,o){return n.areEqual(e,t,!0)?(r=o,!1):void 0}),r},e.prototype.lastIndexOf=function(t,e){var r=-1;return this.forEach(e?function(o,i){n.areEqual(e(o,i),e(t,i),!0)&&(r=i)}:function(e,o){n.areEqual(e,t,!0)&&(r=o)}),r},e.prototype.merge=function(e){return t.prototype.merge.call(this,e)},e.prototype.concat=function(){for(var t=[],e=0;et(n)?e:n})},e.prototype.minBy=function(t){return void 0===t&&(t=b.Identity),this.aggregate(function(e,n){return t(e)0?1:-1)}),isNaN(e)?NaN:n?n*(1/0):e},e.prototype.product=function(t){void 0===t&&(t=u.Type.numberOrNaN);var e=1,n=!1;return this.forEach(function(r,o){n=!0;var i=t(r,o);return isNaN(i)?(e=NaN,!1):0==i?(e=0,!1):void(e*=i)}),n&&isNaN(e)?NaN:e},e.prototype.quotient=function(t){void 0===t&&(t=u.Type.numberOrNaN);var e=0,n=NaN;return this.forEach(function(r,o){var i=t(r,o);if(e++,1===e)n=i;else{if(isNaN(i)||0===i||!isFinite(i))return n=NaN,!1;n/=i}}),1===e&&(n=NaN),n},e.prototype.last=function(){var t=this;t.throwIfDisposed();var e=void 0,n=!1;if(t.forEach(function(t){n=!0,e=t}),!n)throw new Error("last:No element satisfies the condition.");return e},e.prototype.lastOrDefault=function(t){void 0===t&&(t=null);var e=this;e.throwIfDisposed();var n=void 0,r=!1;return e.forEach(function(t){r=!0,n=t}),r?n:t},e.prototype.share=function(){return t.prototype.share.call(this)},e.prototype.catchError=function(e){return t.prototype.catchError.call(this,e)},e.prototype.finallyAction=function(e){return t.prototype.finallyAction.call(this,e)},e.prototype.memoize=function(){var t,n,r=this,o=!r.throwIfDisposed();return new e(function(){var e=0;return new f.EnumeratorBase(function(){I(o),n||(n=r.getEnumerator()),t||(t=[]),e=0},function(r){I(o);var i=e++;return i>=t.length?n.moveNext()?r.yieldReturn(t[i]=n.current):!1:r.yieldReturn(t[i])})},function(){o=!0,t&&(t.length=0),t=null,y.dispose(n),n=null})},e}(A);e.Enumerable=O;var k=function(t){function e(e,n){t.call(this,e,n,!1)}return __extends(e,t),e}(O);e.FiniteEnumerable=k;var S=function(t){function e(e){t.call(this,function(){return n.throwIfDisposed(),new c.ArrayEnumerator(function(){return n.throwIfDisposed("The underlying ArrayEnumerable was disposed.","ArrayEnumerator"),n._source})});var n=this;n._disposableObjectName="ArrayEnumerable",n._source=e}return __extends(e,t),e.prototype._onDispose=function(){t.prototype._onDispose.call(this),this._source=null},Object.defineProperty(e.prototype,"source",{get:function(){return this._source},enumerable:!0,configurable:!0}),e.prototype.toArray=function(){var t=this;return t.throwIfDisposed(),i.toArray(t._source)},e.prototype.asEnumerable=function(){return new e(this._source)},e.prototype.forEach=function(t){var e=this;e.throwIfDisposed(),i.forEach(e._source,t)},e.prototype.any=function(e){var n=this;n.throwIfDisposed();var r=n._source,o=r.length;return o&&(!e||t.prototype.any.call(this,e))},e.prototype.count=function(e){var n=this;n.throwIfDisposed();var r=n._source,o=r.length;return o&&(e?t.prototype.count.call(this,e):o)},e.prototype.elementAtOrDefault=function(t,e){void 0===e&&(e=null);var n=this;n.throwIfDisposed(),s.Integer.assertZeroOrGreater(t,"index");var r=n._source;return t0?new O(function(){return new c.ArrayEnumerator(function(){return e._source},t)}):e},e.prototype.takeExceptLast=function(t){void 0===t&&(t=1);var e=this;return e.take(e._source.length-t)},e.prototype.skipToLast=function(t){if(!(t>0))return O.empty();var e=this;if(!isFinite(t))return e;var n=e._source?e._source.length:0;return e.skip(n-t)},e.prototype.reverse=function(){var t=this;return new O(function(){return new c.ArrayEnumerator(function(){return t._source},t._source?t._source.length-1:0,-1)})},e.prototype.memoize=function(){return this.asEnumerable()},e.prototype.sequenceEqual=function(o,i){return void 0===i&&(i=n.areEqual),u.Type.isArrayLike(o)?r.areEqual(this.source,o,!0,i):o instanceof e?o.sequenceEqual(this.source,i):t.prototype.sequenceEqual.call(this,o,i)},e.prototype.toJoinedString=function(e,n){void 0===e&&(e=""),void 0===n&&(n=b.Identity);var r=this._source;return!n&&Array.isArray(r)?r.join(e):t.prototype.toJoinedString.call(this,e,n)},e}(k),F=function(t){function e(e,n){t.call(this,n),this._groupKey=e}return __extends(e,t),Object.defineProperty(e.prototype,"key",{get:function(){return this._groupKey},enumerable:!0,configurable:!0}),e}(S),T=function(){function t(t){this._dictionary=t}return Object.defineProperty(t.prototype,"count",{get:function(){return this._dictionary.count},enumerable:!0,configurable:!0}),t.prototype.get=function(t){return this._dictionary.getValue(t)},t.prototype.contains=function(t){return this._dictionary.containsKey(t)},t.prototype.getEnumerator=function(){var t,e=this;return new f.EnumeratorBase(function(){
+t=e._dictionary.getEnumerator()},function(e){if(!t.moveNext())return!1;var n=t.current;return e.yieldReturn(new F(n.key,n.value))},function(){y.dispose(t)})},t}(),q=function(t){function e(e,r,o,u,s){void 0===s&&(s=n.compare),t.call(this,null),this.source=e,this.keySelector=r,this.order=o,this.parent=u,this.comparer=s,i.throwIfEndless(e&&e.isEndless)}return __extends(e,t),e.prototype.createOrderedEnumerable=function(t,n){return new e(this.source,t,n,this)},e.prototype.thenBy=function(t){return this.createOrderedEnumerable(t,1)},e.prototype.thenUsing=function(t){return new e(this.source,null,1,this,t)},e.prototype.thenByDescending=function(t){return this.createOrderedEnumerable(t,-1)},e.prototype.thenUsingReversed=function(t){return new e(this.source,null,-1,this,t)},e.prototype.getEnumerator=function(){var t,e,n=this,r=0;return new f.EnumeratorBase(function(){r=0,t=O.toArray(n.source),e=N(n).generateSortedIndexes(t)},function(n){return r b ? a : b;\n };\n LinqFunctions.prototype.Lesser = function (a, b) {\n return a < b ? a : b;\n };\n return LinqFunctions;\n }(Functions_1.default));\n var Functions = new LinqFunctions();\n Object.freeze(Functions);\n function getEmptyEnumerator() {\n return Enumerator_1.empty;\n }\n var InfiniteEnumerable = (function (_super) {\n __extends(InfiniteEnumerable, _super);\n function InfiniteEnumerable(_enumeratorFactory, finalizer) {\n _super.call(this, finalizer);\n this._enumeratorFactory = _enumeratorFactory;\n this._isEndless = true;\n }\n Object.defineProperty(InfiniteEnumerable.prototype, \"isEndless\", {\n get: function () {\n return this._isEndless;\n },\n enumerable: true,\n configurable: true\n });\n InfiniteEnumerable.prototype.getEnumerator = function () {\n this.throwIfDisposed();\n return this._enumeratorFactory();\n };\n InfiniteEnumerable.prototype._onDispose = function () {\n _super.prototype._onDispose.call(this);\n this._enumeratorFactory = null;\n };\n InfiniteEnumerable.prototype.asEnumerable = function () {\n var _ = this;\n _.throwIfDisposed();\n return new InfiniteEnumerable(function () { return _.getEnumerator(); });\n };\n InfiniteEnumerable.prototype.doAction = function (action, initializer, isEndless) {\n if (isEndless === void 0) { isEndless = this.isEndless; }\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n if (initializer)\n initializer();\n index = 0;\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n while (enumerator.moveNext()) {\n var actionResult = action(enumerator.current, index++);\n if (actionResult === false || actionResult === 0)\n return yielder.yieldBreak();\n if (actionResult !== 2)\n return yielder.yieldReturn(enumerator.current);\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n }, isEndless);\n }, function () {\n disposed = true;\n }, isEndless);\n };\n InfiniteEnumerable.prototype.force = function () {\n this.throwIfDisposed();\n this.doAction(BREAK)\n .getEnumerator()\n .moveNext();\n };\n InfiniteEnumerable.prototype.skip = function (count) {\n var _ = this;\n _.throwIfDisposed();\n if (!isFinite(count))\n return Enumerable.empty();\n Integer_1.default.assert(count, \"count\");\n return this.doAction(function (element, index) {\n return index < count\n ? 2\n : 1;\n });\n };\n InfiniteEnumerable.prototype.take = function (count) {\n if (!(count > 0))\n return Enumerable.empty();\n var _ = this;\n _.throwIfDisposed();\n if (!isFinite(count))\n throw new ArgumentOutOfRangeException_1.default('count', count, 'Must be finite.');\n Integer_1.default.assert(count, \"count\");\n return _.doAction(function (element, index) { return index < count; }, null, false);\n };\n InfiniteEnumerable.prototype.elementAt = function (index) {\n var v = this.elementAtOrDefault(index, INVALID_DEFAULT);\n if (v === INVALID_DEFAULT)\n throw new ArgumentOutOfRangeException_1.default('index', index, \"is greater than or equal to the number of elements in source\");\n return v;\n };\n InfiniteEnumerable.prototype.elementAtOrDefault = function (index, defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this;\n _.throwIfDisposed();\n Integer_1.default.assertZeroOrGreater(index, 'index');\n var n = index;\n return dispose_1.using(this.getEnumerator(), function (e) {\n var i = 0;\n while (e.moveNext()) {\n if (i == n)\n return e.current;\n i++;\n }\n return defaultValue;\n });\n };\n InfiniteEnumerable.prototype.first = function () {\n var v = this.firstOrDefault(INVALID_DEFAULT);\n if (v === INVALID_DEFAULT)\n throw new Error(\"first:The sequence is empty.\");\n return v;\n };\n InfiniteEnumerable.prototype.firstOrDefault = function (defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this;\n _.throwIfDisposed();\n return dispose_1.using(this.getEnumerator(), function (e) { return e.moveNext() ? e.current : defaultValue; });\n };\n InfiniteEnumerable.prototype.single = function () {\n var _ = this;\n _.throwIfDisposed();\n return dispose_1.using(this.getEnumerator(), function (e) {\n if (e.moveNext()) {\n var value = e.current;\n if (!e.moveNext())\n return value;\n throw new Error(\"single:sequence contains more than one element.\");\n }\n throw new Error(\"single:The sequence is empty.\");\n });\n };\n InfiniteEnumerable.prototype.singleOrDefault = function (defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this;\n _.throwIfDisposed();\n return dispose_1.using(this.getEnumerator(), function (e) {\n if (e.moveNext()) {\n var value = e.current;\n if (!e.moveNext())\n return value;\n }\n return defaultValue;\n });\n };\n InfiniteEnumerable.prototype.any = function () {\n var _ = this;\n _.throwIfDisposed();\n return dispose_1.using(this.getEnumerator(), function (e) { return e.moveNext(); });\n };\n InfiniteEnumerable.prototype.isEmpty = function () {\n return !this.any();\n };\n InfiniteEnumerable.prototype.traverseBreadthFirst = function (childrenSelector, resultSelector) {\n if (resultSelector === void 0) { resultSelector = Functions.Identity; }\n var _ = this, isEndless = _._isEndless || null;\n return new Enumerable(function () {\n var enumerator;\n var nestLevel = 0;\n var buffer, len;\n return new EnumeratorBase_1.default(function () {\n nestLevel = 0;\n buffer = [];\n len = 0;\n enumerator = _.getEnumerator();\n }, function (yielder) {\n while (true) {\n if (enumerator.moveNext()) {\n buffer[len++] = enumerator.current;\n return yielder.yieldReturn(resultSelector(enumerator.current, nestLevel));\n }\n if (!len)\n return yielder.yieldBreak();\n var next = Enumerable\n .from(buffer)\n .selectMany(childrenSelector);\n if (!next.any()) {\n return yielder.yieldBreak();\n }\n else {\n nestLevel++;\n buffer = [];\n len = 0;\n enumerator.dispose();\n enumerator = next.getEnumerator();\n }\n }\n }, function () {\n dispose_1.dispose(enumerator);\n buffer.length = 0;\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.traverseDepthFirst = function (childrenSelector, resultSelector) {\n if (resultSelector === void 0) { resultSelector = Functions.Identity; }\n var _ = this, isEndless = _._isEndless || null;\n return new Enumerable(function () {\n var enumeratorStack = [];\n var enumerator;\n var len;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n len = 0;\n }, function (yielder) {\n while (true) {\n if (enumerator.moveNext()) {\n var value = resultSelector(enumerator.current, len);\n enumeratorStack[len++] = enumerator;\n var e = Enumerable.fromAny(childrenSelector(enumerator.current));\n enumerator = e ? e.getEnumerator() : Enumerator_1.empty;\n return yielder.yieldReturn(value);\n }\n if (len == 0)\n return false;\n enumerator.dispose();\n enumerator = enumeratorStack[--len];\n enumeratorStack.length = len;\n }\n }, function () {\n try {\n dispose_1.dispose(enumerator);\n }\n finally {\n dispose_1.dispose.these(enumeratorStack);\n }\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.flatten = function () {\n var _ = this, isEndless = _._isEndless || null;\n return new Enumerable(function () {\n var enumerator;\n var middleEnumerator = null;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n }, function (yielder) {\n while (true) {\n if (middleEnumerator) {\n if (middleEnumerator.moveNext()) {\n return yielder.yieldReturn(middleEnumerator.current);\n }\n else {\n middleEnumerator.dispose();\n middleEnumerator = null;\n }\n }\n if (enumerator.moveNext()) {\n var c = enumerator.current;\n var e = !Types_1.default.isString(c) && Enumerable.fromAny(c);\n if (e) {\n middleEnumerator\n = e\n .selectMany(Functions.Identity)\n .flatten()\n .getEnumerator();\n continue;\n }\n else {\n return yielder.yieldReturn(c);\n }\n }\n return yielder.yieldBreak();\n }\n }, function () {\n dispose_1.dispose(enumerator, middleEnumerator);\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.pairwise = function (selector) {\n var _ = this;\n return new Enumerable(function () {\n var enumerator;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n enumerator.moveNext();\n }, function (yielder) {\n var prev = enumerator.current;\n return enumerator.moveNext()\n && yielder.yieldReturn(selector(prev, enumerator.current));\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, null, _._isEndless);\n };\n InfiniteEnumerable.prototype.scan = function (func, seed) {\n var isUseSeed = seed !== VOID0;\n var _ = this;\n return new Enumerable(function () {\n var enumerator;\n var value;\n var isFirst;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n isFirst = true;\n }, function (yielder) {\n if (isFirst) {\n isFirst = false;\n return isUseSeed\n ? yielder.yieldReturn(value = seed)\n : enumerator.moveNext() && yielder.yieldReturn(value\n = enumerator.current);\n }\n return (enumerator.moveNext())\n ? yielder.yieldReturn(value = func(value, enumerator.current))\n : false;\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, null, _._isEndless);\n };\n InfiniteEnumerable.prototype.select = function (selector) {\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n index = 0;\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n return enumerator.moveNext()\n ? yielder.yieldReturn(selector(enumerator.current, index++))\n : yielder.yieldBreak();\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, function () {\n disposed = true;\n }, _._isEndless);\n };\n InfiniteEnumerable.prototype._selectMany = function (collectionSelector, resultSelector) {\n var _ = this, isEndless = _._isEndless || null;\n if (!resultSelector)\n resultSelector = function (a, b) { return b; };\n return new Enumerable(function () {\n var enumerator;\n var middleEnumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n middleEnumerator = undefined;\n index = 0;\n }, function (yielder) {\n if (middleEnumerator === VOID0 && !enumerator.moveNext())\n return false;\n do {\n if (!middleEnumerator) {\n var middleSeq = collectionSelector(enumerator.current, index++);\n if (!middleSeq)\n continue;\n middleEnumerator = Enumerator_1.from(middleSeq);\n }\n if (middleEnumerator.moveNext())\n return yielder.yieldReturn(resultSelector(enumerator.current, middleEnumerator.current));\n middleEnumerator.dispose();\n middleEnumerator = null;\n } while (enumerator.moveNext());\n return false;\n }, function () {\n dispose_1.dispose(enumerator, middleEnumerator);\n enumerator = null;\n middleEnumerator = null;\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.selectMany = function (collectionSelector, resultSelector) {\n return this._selectMany(collectionSelector, resultSelector);\n };\n InfiniteEnumerable.prototype._choose = function (selector) {\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n index = 0;\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n while (enumerator.moveNext()) {\n var result = selector(enumerator.current, index++);\n if (result !== null && result !== VOID0)\n return yielder.yieldReturn(result);\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, function () {\n disposed = true;\n }, _._isEndless);\n };\n InfiniteEnumerable.prototype.choose = function (selector) {\n if (selector === void 0) { selector = Functions.Identity; }\n return this._choose(selector);\n };\n InfiniteEnumerable.prototype.where = function (predicate) {\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n index = 0;\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n while (enumerator.moveNext()) {\n if (predicate(enumerator.current, index++))\n return yielder.yieldReturn(enumerator.current);\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, function () {\n disposed = true;\n }, _._isEndless);\n };\n InfiniteEnumerable.prototype.ofType = function (type) {\n var typeName;\n switch (type) {\n case Number:\n typeName = Types_1.default.NUMBER;\n break;\n case String:\n typeName = Types_1.default.STRING;\n break;\n case Boolean:\n typeName = Types_1.default.BOOLEAN;\n break;\n case Function:\n typeName = Types_1.default.FUNCTION;\n break;\n default:\n return this\n .where(function (x) { return x instanceof type; });\n }\n return this\n .choose()\n .where(function (x) { return (typeof x) === typeName; });\n };\n InfiniteEnumerable.prototype.except = function (second, compareSelector) {\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var keys;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n enumerator = _.getEnumerator();\n keys = new Dictionary_1.default(compareSelector);\n if (second)\n Enumerator_1.forEach(second, function (key) { return keys.addByKeyValue(key, true); });\n }, function (yielder) {\n throwIfDisposed(disposed);\n while (enumerator.moveNext()) {\n var current = enumerator.current;\n if (!keys.containsKey(current)) {\n keys.addByKeyValue(current, true);\n return yielder.yieldReturn(current);\n }\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n keys.clear();\n }, _._isEndless);\n }, function () {\n disposed = true;\n }, _._isEndless);\n };\n InfiniteEnumerable.prototype.distinct = function (compareSelector) {\n return this.except(null, compareSelector);\n };\n InfiniteEnumerable.prototype.distinctUntilChanged = function (compareSelector) {\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var compareKey;\n var initial = true;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n while (enumerator.moveNext()) {\n var key = compareSelector(enumerator.current);\n if (initial) {\n initial = false;\n }\n else if (Values.areEqual(compareKey, key)) {\n continue;\n }\n compareKey = key;\n return yielder.yieldReturn(enumerator.current);\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, function () {\n disposed = true;\n }, _._isEndless);\n };\n InfiniteEnumerable.prototype.defaultIfEmpty = function (defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n var isFirst;\n return new EnumeratorBase_1.default(function () {\n isFirst = true;\n throwIfDisposed(disposed);\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n if (enumerator.moveNext()) {\n isFirst = false;\n return yielder.yieldReturn(enumerator.current);\n }\n else if (isFirst) {\n isFirst = false;\n return yielder.yieldReturn(defaultValue);\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, null, _._isEndless);\n };\n InfiniteEnumerable.prototype.zip = function (second, resultSelector) {\n var _ = this;\n _.throwIfDisposed();\n return new Enumerable(function () {\n var firstEnumerator;\n var secondEnumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n firstEnumerator = _.getEnumerator();\n secondEnumerator = Enumerator_1.from(second);\n }, function (yielder) { return firstEnumerator.moveNext()\n && secondEnumerator.moveNext()\n && yielder.yieldReturn(resultSelector(firstEnumerator.current, secondEnumerator.current, index++)); }, function () {\n dispose_1.dispose(firstEnumerator, secondEnumerator);\n });\n });\n };\n InfiniteEnumerable.prototype.zipMultiple = function (second, resultSelector) {\n var _ = this;\n _.throwIfDisposed();\n if (!second.length)\n return Enumerable.empty();\n return new Enumerable(function () {\n var secondTemp;\n var firstEnumerator;\n var secondEnumerator;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n secondTemp = new Queue_1.default(second);\n index = 0;\n firstEnumerator = _.getEnumerator();\n secondEnumerator = null;\n }, function (yielder) {\n if (firstEnumerator.moveNext()) {\n while (true) {\n while (!secondEnumerator) {\n if (secondTemp.count) {\n var next = secondTemp.dequeue();\n if (next)\n secondEnumerator = Enumerator_1.from(next);\n }\n else\n return yielder.yieldBreak();\n }\n if (secondEnumerator.moveNext())\n return yielder.yieldReturn(resultSelector(firstEnumerator.current, secondEnumerator.current, index++));\n secondEnumerator.dispose();\n secondEnumerator = null;\n }\n }\n return yielder.yieldBreak();\n }, function () {\n dispose_1.dispose(firstEnumerator, secondTemp);\n });\n });\n };\n InfiniteEnumerable.prototype.join = function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) {\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var _ = this;\n return new Enumerable(function () {\n var outerEnumerator;\n var lookup;\n var innerElements = null;\n var innerCount = 0;\n return new EnumeratorBase_1.default(function () {\n outerEnumerator = _.getEnumerator();\n lookup = Enumerable.from(inner)\n .toLookup(innerKeySelector, Functions.Identity, compareSelector);\n }, function (yielder) {\n while (true) {\n if (innerElements != null) {\n var innerElement = innerElements[innerCount++];\n if (innerElement !== VOID0)\n return yielder.yieldReturn(resultSelector(outerEnumerator.current, innerElement));\n innerElement = null;\n innerCount = 0;\n }\n if (outerEnumerator.moveNext()) {\n var key = outerKeySelector(outerEnumerator.current);\n innerElements = lookup.get(key);\n }\n else {\n return yielder.yieldBreak();\n }\n }\n }, function () {\n dispose_1.dispose(outerEnumerator);\n });\n });\n };\n InfiniteEnumerable.prototype.groupJoin = function (inner, outerKeySelector, innerKeySelector, resultSelector, compareSelector) {\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var _ = this;\n return new Enumerable(function () {\n var enumerator;\n var lookup = null;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n lookup = Enumerable.from(inner)\n .toLookup(innerKeySelector, Functions.Identity, compareSelector);\n }, function (yielder) {\n return enumerator.moveNext()\n && yielder.yieldReturn(resultSelector(enumerator.current, lookup.get(outerKeySelector(enumerator.current))));\n }, function () {\n dispose_1.dispose(enumerator);\n });\n });\n };\n InfiniteEnumerable.prototype.merge = function (enumerables) {\n var _ = this, isEndless = _._isEndless || null;\n if (!enumerables || enumerables.length == 0)\n return _;\n return new Enumerable(function () {\n var enumerator;\n var queue;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n queue = new Queue_1.default(enumerables);\n }, function (yielder) {\n while (true) {\n while (!enumerator && queue.count) {\n enumerator = Enumerator_1.from(queue.dequeue());\n }\n if (enumerator && enumerator.moveNext())\n return yielder.yieldReturn(enumerator.current);\n if (enumerator) {\n enumerator.dispose();\n enumerator = null;\n continue;\n }\n return yielder.yieldBreak();\n }\n }, function () {\n dispose_1.dispose(enumerator, queue);\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.concat = function () {\n var enumerables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n enumerables[_i - 0] = arguments[_i];\n }\n return this.merge(enumerables);\n };\n InfiniteEnumerable.prototype.union = function (second, compareSelector) {\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var _ = this, isEndless = _._isEndless || null;\n return new Enumerable(function () {\n var firstEnumerator;\n var secondEnumerator;\n var keys;\n return new EnumeratorBase_1.default(function () {\n firstEnumerator = _.getEnumerator();\n keys = new Dictionary_1.default(compareSelector);\n }, function (yielder) {\n var current;\n if (secondEnumerator === VOID0) {\n while (firstEnumerator.moveNext()) {\n current = firstEnumerator.current;\n if (!keys.containsKey(current)) {\n keys.addByKeyValue(current, null);\n return yielder.yieldReturn(current);\n }\n }\n secondEnumerator = Enumerator_1.from(second);\n }\n while (secondEnumerator.moveNext()) {\n current = secondEnumerator.current;\n if (!keys.containsKey(current)) {\n keys.addByKeyValue(current, null);\n return yielder.yieldReturn(current);\n }\n }\n return false;\n }, function () {\n dispose_1.dispose(firstEnumerator, secondEnumerator);\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.insertAt = function (index, other) {\n Integer_1.default.assertZeroOrGreater(index, 'index');\n var n = index;\n var _ = this, isEndless = _._isEndless || null;\n _.throwIfDisposed();\n return new Enumerable(function () {\n var firstEnumerator;\n var secondEnumerator;\n var count = 0;\n var isEnumerated = false;\n return new EnumeratorBase_1.default(function () {\n count = 0;\n firstEnumerator = _.getEnumerator();\n secondEnumerator = Enumerator_1.from(other);\n isEnumerated = false;\n }, function (yielder) {\n if (count == n) {\n isEnumerated = true;\n if (secondEnumerator.moveNext())\n return yielder.yieldReturn(secondEnumerator.current);\n }\n if (firstEnumerator.moveNext()) {\n count++;\n return yielder.yieldReturn(firstEnumerator.current);\n }\n return !isEnumerated\n && secondEnumerator.moveNext()\n && yielder.yieldReturn(secondEnumerator.current);\n }, function () {\n dispose_1.dispose(firstEnumerator, secondEnumerator);\n }, isEndless);\n }, null, isEndless);\n };\n InfiniteEnumerable.prototype.alternateMultiple = function (sequence) {\n var _ = this;\n return new Enumerable(function () {\n var buffer, mode, enumerator, alternateEnumerator;\n return new EnumeratorBase_1.default(function () {\n alternateEnumerator = new ArrayEnumerator_1.default(Enumerable.toArray(sequence));\n enumerator = _.getEnumerator();\n var hasAtLeastOne = enumerator.moveNext();\n mode = hasAtLeastOne\n ? 1\n : 0;\n if (hasAtLeastOne)\n buffer = enumerator.current;\n }, function (yielder) {\n switch (mode) {\n case 0:\n return yielder.yieldBreak();\n case 2:\n if (alternateEnumerator.moveNext())\n return yielder.yieldReturn(alternateEnumerator.current);\n alternateEnumerator.reset();\n mode = 1;\n break;\n }\n var latest = buffer;\n var another = enumerator.moveNext();\n mode = another\n ? 2\n : 0;\n if (another)\n buffer = enumerator.current;\n return yielder.yieldReturn(latest);\n }, function () {\n dispose_1.dispose(enumerator, alternateEnumerator);\n }, _._isEndless);\n }, null, _._isEndless);\n };\n InfiniteEnumerable.prototype.alternateSingle = function (value) {\n return this.alternateMultiple(Enumerable.make(value));\n };\n InfiniteEnumerable.prototype.alternate = function () {\n var sequence = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n sequence[_i - 0] = arguments[_i];\n }\n return this.alternateMultiple(sequence);\n };\n InfiniteEnumerable.prototype.catchError = function (handler) {\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n return new EnumeratorBase_1.default(function () {\n try {\n throwIfDisposed(disposed);\n enumerator = _.getEnumerator();\n }\n catch (e) {\n }\n }, function (yielder) {\n try {\n throwIfDisposed(disposed);\n if (enumerator.moveNext())\n return yielder.yieldReturn(enumerator.current);\n }\n catch (e) {\n handler(e);\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator);\n });\n });\n };\n InfiniteEnumerable.prototype.finallyAction = function (action) {\n var _ = this, disposed = !_.throwIfDisposed();\n return new Enumerable(function () {\n var enumerator;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n enumerator = _.getEnumerator();\n }, function (yielder) {\n throwIfDisposed(disposed);\n return (enumerator.moveNext())\n ? yielder.yieldReturn(enumerator.current)\n : false;\n }, function () {\n try {\n dispose_1.dispose(enumerator);\n }\n finally {\n action();\n }\n });\n });\n };\n InfiniteEnumerable.prototype.buffer = function (size) {\n if (size < 1 || !isFinite(size))\n throw new Error(\"Invalid buffer size.\");\n Integer_1.default.assert(size, \"size\");\n var _ = this, len;\n return new Enumerable(function () {\n var enumerator;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n }, function (yielder) {\n var array = ArrayUtility.initialize(size);\n len = 0;\n while (len < size && enumerator.moveNext()) {\n array[len++] = enumerator.current;\n }\n array.length = len;\n return len && yielder.yieldReturn(array);\n }, function () {\n dispose_1.dispose(enumerator);\n }, _._isEndless);\n }, null, _._isEndless);\n };\n InfiniteEnumerable.prototype.share = function () {\n var _ = this;\n _.throwIfDisposed();\n var sharedEnumerator;\n return new Enumerable(function () {\n return sharedEnumerator || (sharedEnumerator = _.getEnumerator());\n }, function () {\n dispose_1.dispose(sharedEnumerator);\n }, _._isEndless);\n };\n return InfiniteEnumerable;\n }(DisposableBase_1.default));\n exports.InfiniteEnumerable = InfiniteEnumerable;\n var Enumerable = (function (_super) {\n __extends(Enumerable, _super);\n function Enumerable(enumeratorFactory, finalizer, isEndless) {\n if (isEndless === void 0) { isEndless = null; }\n _super.call(this, enumeratorFactory, finalizer);\n this._isEndless = isEndless;\n }\n Enumerable.from = function (source) {\n var e = Enumerable.fromAny(source);\n if (!e)\n throw new UnsupportedEnumerableException_1.default();\n return e;\n };\n Enumerable.fromAny = function (source, defaultEnumerable) {\n if (defaultEnumerable === void 0) { defaultEnumerable = null; }\n if (Types_1.default.isObject(source) || Types_1.default.isString(source)) {\n if (source instanceof Enumerable)\n return source;\n if (Types_1.default.isArrayLike(source))\n return new ArrayEnumerable(source);\n if (Enumerator_1.isEnumerable(source))\n return new Enumerable(function () { return source.getEnumerator(); }, null, source.isEndless);\n }\n return defaultEnumerable;\n };\n Enumerable.fromOrEmpty = function (source) {\n return Enumerable.fromAny(source) || Enumerable.empty();\n };\n Enumerable.toArray = function (source) {\n if (source instanceof Enumerable)\n return source.toArray();\n return Enumerator_1.toArray(source);\n };\n Enumerable.choice = function (values) {\n var len = values && values.length;\n if (!len || !isFinite(len))\n throw new ArgumentOutOfRangeException_1.default('length', length);\n return new InfiniteEnumerable(function () { return new EnumeratorBase_1.default(null, function (yielder) {\n return yielder.yieldReturn(Integer_1.default.random.select(values));\n }, true); });\n };\n Enumerable.chooseFrom = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n return Enumerable.choice(args);\n };\n Enumerable.cycle = function (values) {\n var len = values && values.length;\n if (!len || !isFinite(len))\n throw new ArgumentOutOfRangeException_1.default('length', length);\n return new InfiniteEnumerable(function () {\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n }, function (yielder) {\n if (index >= values.length)\n index = 0;\n return yielder.yieldReturn(values[index++]);\n }, true);\n });\n };\n Enumerable.cycleThrough = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i - 0] = arguments[_i];\n }\n return Enumerable.cycle(args);\n };\n Enumerable.empty = function () {\n return new FiniteEnumerable(getEmptyEnumerator);\n };\n Enumerable.repeat = function (element, count) {\n if (count === void 0) { count = Infinity; }\n if (!(count > 0))\n return Enumerable.empty();\n return isFinite(count) && Integer_1.default.assert(count, \"count\")\n ? new FiniteEnumerable(function () {\n var c = count;\n var index = 0;\n return new EnumeratorBase_1.default(function () { index = 0; }, function (yielder) { return (index++ < c) && yielder.yieldReturn(element); }, null, false);\n })\n : new Enumerable(function () {\n return new EnumeratorBase_1.default(null, function (yielder) { return yielder.yieldReturn(element); }, true);\n });\n };\n Enumerable.repeatWithFinalize = function (initializer, finalizer) {\n return new InfiniteEnumerable(function () {\n var element;\n return new EnumeratorBase_1.default(function () {\n element = initializer();\n }, function (yielder) { return yielder.yieldReturn(element); }, function () {\n finalizer(element);\n }, true);\n });\n };\n Enumerable.make = function (element) {\n return Enumerable.repeat(element, 1);\n };\n Enumerable.range = function (start, count, step) {\n if (step === void 0) { step = 1; }\n if (!isFinite(start))\n throw new ArgumentOutOfRangeException_1.default(\"start\", start, \"Must be a finite number.\");\n if (!(count > 0))\n return Enumerable.empty();\n if (!step)\n throw new ArgumentOutOfRangeException_1.default(\"step\", step, \"Must be a valid value\");\n if (!isFinite(step))\n throw new ArgumentOutOfRangeException_1.default(\"step\", step, \"Must be a finite number.\");\n Integer_1.default.assert(count, \"count\");\n return new FiniteEnumerable(function () {\n var value;\n var c = count;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n value = start;\n }, function (yielder) {\n var result = index++ < c\n && yielder.yieldReturn(value);\n if (result && index < count)\n value += step;\n return result;\n }, false);\n });\n };\n Enumerable.rangeDown = function (start, count, step) {\n if (step === void 0) { step = 1; }\n step = Math.abs(step) * -1;\n return Enumerable.range(start, count, step);\n };\n Enumerable.toInfinity = function (start, step) {\n if (start === void 0) { start = 0; }\n if (step === void 0) { step = 1; }\n if (!isFinite(start))\n throw new ArgumentOutOfRangeException_1.default(\"start\", start, \"Must be a finite number.\");\n if (!step)\n throw new ArgumentOutOfRangeException_1.default(\"step\", step, \"Must be a valid value\");\n if (!isFinite(step))\n throw new ArgumentOutOfRangeException_1.default(\"step\", step, \"Must be a finite number.\");\n return new InfiniteEnumerable(function () {\n var value;\n return new EnumeratorBase_1.default(function () {\n value = start;\n }, function (yielder) {\n var current = value;\n value += step;\n return yielder.yieldReturn(current);\n }, true);\n });\n };\n Enumerable.toNegativeInfinity = function (start, step) {\n if (start === void 0) { start = 0; }\n if (step === void 0) { step = 1; }\n return Enumerable.toInfinity(start, -step);\n };\n Enumerable.rangeTo = function (start, to, step) {\n if (step === void 0) { step = 1; }\n if (isNaN(to) || !isFinite(to))\n throw new ArgumentOutOfRangeException_1.default(\"to\", to, \"Must be a finite number.\");\n if (step && !isFinite(step))\n throw new ArgumentOutOfRangeException_1.default(\"step\", step, \"Must be a finite non-zero number.\");\n step = Math.abs(step);\n return new FiniteEnumerable(function () {\n var value;\n return new EnumeratorBase_1.default(function () { value = start; }, start < to\n ?\n function (yielder) {\n var result = value <= to && yielder.yieldReturn(value);\n if (result)\n value += step;\n return result;\n }\n :\n function (yielder) {\n var result = value >= to && yielder.yieldReturn(value);\n if (result)\n value -= step;\n return result;\n }, false);\n });\n };\n Enumerable.matches = function (input, pattern, flags) {\n if (flags === void 0) { flags = \"\"; }\n if (input === null || input === VOID0)\n throw new ArgumentNullException_1.default(\"input\");\n var type = typeof input;\n if (type != Types_1.default.STRING)\n throw new Error(\"Cannot exec RegExp matches of type '\" + type + \"'.\");\n if (pattern instanceof RegExp) {\n flags += (pattern.ignoreCase) ? \"i\" : \"\";\n flags += (pattern.multiline) ? \"m\" : \"\";\n pattern = pattern.source;\n }\n if (flags.indexOf(\"g\") === -1)\n flags += \"g\";\n return new FiniteEnumerable(function () {\n var regex;\n return new EnumeratorBase_1.default(function () {\n regex = new RegExp(pattern, flags);\n }, function (yielder) {\n var match = regex.exec(input);\n return (match !== null) ? yielder.yieldReturn(match) : false;\n });\n });\n };\n Enumerable.generate = function (factory, count) {\n if (count === void 0) { count = Infinity; }\n if (isNaN(count) || count <= 0)\n return Enumerable.empty();\n return isFinite(count) && Integer_1.default.assert(count, \"count\")\n ?\n new FiniteEnumerable(function () {\n var c = count;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n }, function (yielder) {\n var current = index++;\n return current < c && yielder.yieldReturn(factory(current));\n }, false);\n })\n :\n new InfiniteEnumerable(function () {\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n }, function (yielder) { return yielder.yieldReturn(factory(index++)); }, true);\n });\n };\n Enumerable.unfold = function (seed, valueFactory, skipSeed) {\n if (skipSeed === void 0) { skipSeed = false; }\n return new InfiniteEnumerable(function () {\n var index = 0;\n var value;\n var isFirst;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n value = seed;\n isFirst = !skipSeed;\n }, function (yielder) {\n var i = index++;\n if (isFirst)\n isFirst = false;\n else\n value = valueFactory(value, i);\n return yielder.yieldReturn(value);\n }, true);\n });\n };\n Enumerable.forEach = function (enumerable, action) {\n Enumerator_1.forEach(enumerable, action);\n };\n Enumerable.map = function (enumerable, selector) {\n return Enumerator_1.map(enumerable, selector);\n };\n Enumerable.max = function (values) {\n return values\n .takeUntil(function (v) { return v == +Infinity; }, true)\n .aggregate(Functions.Greater);\n };\n Enumerable.min = function (values) {\n return values\n .takeUntil(function (v) { return v == -Infinity; }, true)\n .aggregate(Functions.Lesser);\n };\n Enumerable.weave = function (enumerables) {\n if (!enumerables)\n throw new ArgumentNullException_1.default('enumerables');\n return new Enumerable(function () {\n var queue;\n var mainEnumerator;\n var index;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n queue = new Queue_1.default();\n mainEnumerator = Enumerator_1.from(enumerables);\n }, function (yielder) {\n var e;\n if (mainEnumerator) {\n while (!e && mainEnumerator.moveNext()) {\n var c = mainEnumerator.current;\n e = nextEnumerator(queue, c && Enumerator_1.from(c));\n }\n if (!e)\n mainEnumerator = null;\n }\n while (!e && queue.count) {\n e = nextEnumerator(queue, queue.dequeue());\n }\n return e\n ? yielder.yieldReturn(e.current)\n : yielder.yieldBreak();\n }, function () {\n dispose_1.dispose.these(queue.dump());\n dispose_1.dispose(mainEnumerator, queue);\n mainEnumerator = null;\n queue = null;\n });\n });\n };\n Enumerable.prototype.doAction = function (action, initializer, isEndless) {\n if (isEndless === void 0) { isEndless = this.isEndless; }\n return _super.prototype.doAction.call(this, action, initializer, isEndless);\n };\n Enumerable.prototype.skip = function (count) {\n return _super.prototype.skip.call(this, count);\n };\n Enumerable.prototype.skipWhile = function (predicate) {\n this.throwIfDisposed();\n return this.doAction(function (element, index) {\n return predicate(element, index)\n ? 2\n : 1;\n });\n };\n Enumerable.prototype.takeWhile = function (predicate) {\n this.throwIfDisposed();\n if (!predicate)\n throw new ArgumentNullException_1.default('predicate');\n return this.doAction(function (element, index) {\n return predicate(element, index)\n ? 1\n : 0;\n }, null, null);\n };\n Enumerable.prototype.takeUntil = function (predicate, includeUntilValue) {\n this.throwIfDisposed();\n if (!predicate)\n throw new ArgumentNullException_1.default('predicate');\n if (!includeUntilValue)\n return this.doAction(function (element, index) {\n return predicate(element, index)\n ? 0\n : 1;\n }, null, null);\n var found = false;\n return this.doAction(function (element, index) {\n if (found)\n return 0;\n found = predicate(element, index);\n return 1;\n }, function () {\n found = false;\n }, null);\n };\n Enumerable.prototype.forEach = function (action) {\n var _ = this;\n _.throwIfDisposed();\n Enumerator_1.throwIfEndless(_.isEndless);\n var index = 0;\n dispose_1.using(_.getEnumerator(), function (e) {\n Enumerator_1.throwIfEndless(e.isEndless);\n while (_.throwIfDisposed() && e.moveNext()) {\n if (action(e.current, index++) === false)\n break;\n }\n });\n };\n Enumerable.prototype.toArray = function (predicate) {\n return predicate\n ? this.where(predicate).toArray()\n : this.copyTo([]);\n };\n Enumerable.prototype.copyTo = function (target, index) {\n if (index === void 0) { index = 0; }\n this.throwIfDisposed();\n if (!target)\n throw new ArgumentNullException_1.default(\"target\");\n Integer_1.default.assertZeroOrGreater(index);\n Enumerator_1.forEach(this, function (x, i) {\n target[i + index] = x;\n });\n return target;\n };\n Enumerable.prototype.toLookup = function (keySelector, elementSelector, compareSelector) {\n if (elementSelector === void 0) { elementSelector = Functions.Identity; }\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var dict = new Dictionary_1.default(compareSelector);\n this.forEach(function (x) {\n var key = keySelector(x);\n var element = elementSelector(x);\n var array = dict.getValue(key);\n if (array !== VOID0)\n array.push(element);\n else\n dict.addByKeyValue(key, [element]);\n });\n return new Lookup(dict);\n };\n Enumerable.prototype.toMap = function (keySelector, elementSelector) {\n var obj = {};\n this.forEach(function (x, i) {\n obj[keySelector(x, i)] = elementSelector(x, i);\n });\n return obj;\n };\n Enumerable.prototype.toDictionary = function (keySelector, elementSelector, compareSelector) {\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var dict = new Dictionary_1.default(compareSelector);\n this.forEach(function (x, i) { return dict.addByKeyValue(keySelector(x, i), elementSelector(x, i)); });\n return dict;\n };\n Enumerable.prototype.toJoinedString = function (separator, selector) {\n if (separator === void 0) { separator = \"\"; }\n if (selector === void 0) { selector = Functions.Identity; }\n return this.select(selector).toArray().join(separator);\n };\n Enumerable.prototype.takeExceptLast = function (count) {\n if (count === void 0) { count = 1; }\n var _ = this;\n if (!(count > 0))\n return _;\n if (!isFinite(count))\n return Enumerable.empty();\n Integer_1.default.assert(count, \"count\");\n var c = count;\n return new Enumerable(function () {\n var enumerator;\n var q;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n q = new Queue_1.default();\n }, function (yielder) {\n while (enumerator.moveNext()) {\n q.enqueue(enumerator.current);\n if (q.count > c)\n return yielder.yieldReturn(q.dequeue());\n }\n return false;\n }, function () {\n dispose_1.dispose(enumerator, q);\n });\n });\n };\n Enumerable.prototype.skipToLast = function (count) {\n if (!(count > 0))\n return Enumerable.empty();\n var _ = this;\n if (!isFinite(count))\n return _;\n Integer_1.default.assert(count, \"count\");\n return _.reverse()\n .take(count)\n .reverse();\n };\n Enumerable.prototype.where = function (predicate) {\n return _super.prototype.where.call(this, predicate);\n };\n Enumerable.prototype.select = function (selector) {\n return _super.prototype.select.call(this, selector);\n };\n Enumerable.prototype.selectMany = function (collectionSelector, resultSelector) {\n return this._selectMany(collectionSelector, resultSelector);\n };\n Enumerable.prototype.choose = function (selector) {\n if (selector === void 0) { selector = Functions.Identity; }\n return this._choose(selector);\n };\n Enumerable.prototype.reverse = function () {\n var _ = this, disposed = !_.throwIfDisposed();\n Enumerator_1.throwIfEndless(_._isEndless);\n return new Enumerable(function () {\n var buffer;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n buffer = _.toArray();\n index = buffer.length;\n }, function (yielder) { return index && yielder.yieldReturn(buffer[--index]); }, function () {\n buffer.length = 0;\n });\n }, function () {\n disposed = true;\n });\n };\n Enumerable.prototype.shuffle = function () {\n var _ = this, disposed = !_.throwIfDisposed();\n Enumerator_1.throwIfEndless(_._isEndless);\n return new Enumerable(function () {\n var buffer;\n var capacity;\n var len;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n buffer = _.toArray();\n capacity = len = buffer.length;\n }, function (yielder) {\n if (!len)\n return yielder.yieldBreak();\n var selectedIndex = Integer_1.default.random(len);\n var selectedValue = buffer[selectedIndex];\n buffer[selectedIndex] = buffer[--len];\n buffer[len] = null;\n if (len % 32 == 0)\n buffer.length = len;\n return yielder.yieldReturn(selectedValue);\n }, function () {\n buffer.length = 0;\n });\n }, function () {\n disposed = true;\n });\n };\n Enumerable.prototype.count = function (predicate) {\n var count = 0;\n this.forEach(predicate\n ?\n function (x, i) {\n if (predicate(x, i))\n ++count;\n }\n :\n function () {\n ++count;\n });\n return count;\n };\n Enumerable.prototype.all = function (predicate) {\n if (!predicate)\n throw new ArgumentNullException_1.default(\"predicate\");\n var result = true;\n this.forEach(function (x, i) {\n if (!predicate(x, i)) {\n result = false;\n return false;\n }\n });\n return result;\n };\n Enumerable.prototype.every = function (predicate) {\n return this.all(predicate);\n };\n Enumerable.prototype.any = function (predicate) {\n if (!predicate)\n return _super.prototype.any.call(this);\n var result = false;\n this.forEach(function (x, i) {\n result = predicate(x, i);\n return !result;\n });\n return result;\n };\n Enumerable.prototype.some = function (predicate) {\n return this.any(predicate);\n };\n Enumerable.prototype.contains = function (value, compareSelector) {\n return compareSelector\n ? this.any(function (v) { return compareSelector(v) === compareSelector(value); })\n : this.any(function (v) { return v === value; });\n };\n Enumerable.prototype.indexOf = function (value, compareSelector) {\n var found = -1;\n this.forEach(compareSelector\n ?\n function (element, i) {\n if (Values.areEqual(compareSelector(element, i), compareSelector(value, i), true)) {\n found = i;\n return false;\n }\n }\n :\n function (element, i) {\n if (Values.areEqual(element, value, true)) {\n found = i;\n return false;\n }\n });\n return found;\n };\n Enumerable.prototype.lastIndexOf = function (value, compareSelector) {\n var result = -1;\n this.forEach(compareSelector\n ?\n function (element, i) {\n if (Values.areEqual(compareSelector(element, i), compareSelector(value, i), true))\n result\n = i;\n }\n :\n function (element, i) {\n if (Values.areEqual(element, value, true))\n result = i;\n });\n return result;\n };\n Enumerable.prototype.merge = function (enumerables) {\n return _super.prototype.merge.call(this, enumerables);\n };\n Enumerable.prototype.concat = function () {\n var enumerables = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n enumerables[_i - 0] = arguments[_i];\n }\n return this.merge(enumerables);\n };\n Enumerable.prototype.intersect = function (second, compareSelector) {\n var _ = this;\n return new Enumerable(function () {\n var enumerator;\n var keys;\n var outs;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n keys = new Dictionary_1.default(compareSelector);\n outs = new Dictionary_1.default(compareSelector);\n Enumerator_1.forEach(second, function (key) {\n keys.addByKeyValue(key, true);\n });\n }, function (yielder) {\n while (enumerator.moveNext()) {\n var current = enumerator.current;\n if (!outs.containsKey(current) && keys.containsKey(current)) {\n outs.addByKeyValue(current, true);\n return yielder.yieldReturn(current);\n }\n }\n return yielder.yieldBreak();\n }, function () {\n dispose_1.dispose(enumerator, keys, outs);\n }, _._isEndless);\n }, null, _._isEndless);\n };\n Enumerable.prototype.sequenceEqual = function (second, equalityComparer) {\n if (equalityComparer === void 0) { equalityComparer = Values.areEqual; }\n return dispose_1.using(this.getEnumerator(), function (e1) { return dispose_1.using(Enumerator_1.from(second), function (e2) {\n Enumerator_1.throwIfEndless(e1.isEndless && e2.isEndless);\n while (e1.moveNext()) {\n if (!e2.moveNext() || !equalityComparer(e1.current, e2.current))\n return false;\n }\n return !e2.moveNext();\n }); });\n };\n Enumerable.prototype.ofType = function (type) {\n return _super.prototype.ofType.call(this, type);\n };\n Enumerable.prototype.except = function (second, compareSelector) {\n return _super.prototype.except.call(this, second, compareSelector);\n };\n Enumerable.prototype.distinct = function (compareSelector) {\n return _super.prototype.distinct.call(this, compareSelector);\n };\n Enumerable.prototype.distinctUntilChanged = function (compareSelector) {\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n return _super.prototype.distinctUntilChanged.call(this, compareSelector);\n };\n Enumerable.prototype.orderBy = function (keySelector) {\n if (keySelector === void 0) { keySelector = Functions.Identity; }\n return new OrderedEnumerable(this, keySelector, 1);\n };\n Enumerable.prototype.orderUsing = function (comparison) {\n return new OrderedEnumerable(this, null, 1, null, comparison);\n };\n Enumerable.prototype.orderUsingReversed = function (comparison) {\n return new OrderedEnumerable(this, null, -1, null, comparison);\n };\n Enumerable.prototype.orderByDescending = function (keySelector) {\n if (keySelector === void 0) { keySelector = Functions.Identity; }\n return new OrderedEnumerable(this, keySelector, -1);\n };\n Enumerable.prototype.buffer = function (size) {\n return _super.prototype.buffer.call(this, size);\n };\n Enumerable.prototype.groupBy = function (keySelector, elementSelector, compareSelector) {\n var _this = this;\n if (!elementSelector)\n elementSelector = Functions.Identity;\n return new Enumerable(function () { return _this.toLookup(keySelector, elementSelector, compareSelector)\n .getEnumerator(); });\n };\n Enumerable.prototype.partitionBy = function (keySelector, elementSelector, resultSelector, compareSelector) {\n if (resultSelector === void 0) { resultSelector = function (key, elements) { return new Grouping(key, elements); }; }\n if (compareSelector === void 0) { compareSelector = Functions.Identity; }\n var _ = this;\n if (!elementSelector)\n elementSelector = Functions.Identity;\n return new Enumerable(function () {\n var enumerator;\n var key;\n var compareKey;\n var group;\n var len;\n return new EnumeratorBase_1.default(function () {\n enumerator = _.getEnumerator();\n if (enumerator.moveNext()) {\n key = keySelector(enumerator.current);\n compareKey = compareSelector(key);\n group = [elementSelector(enumerator.current)];\n len = 1;\n }\n else\n group = null;\n }, function (yielder) {\n if (!group)\n return yielder.yieldBreak();\n var hasNext, c;\n while ((hasNext = enumerator.moveNext())) {\n c = enumerator.current;\n if (compareKey === compareSelector(keySelector(c)))\n group[len++] = elementSelector(c);\n else\n break;\n }\n var result = resultSelector(key, group);\n if (hasNext) {\n c = enumerator.current;\n key = keySelector(c);\n compareKey = compareSelector(key);\n group = [elementSelector(c)];\n len = 1;\n }\n else {\n group = null;\n }\n return yielder.yieldReturn(result);\n }, function () {\n dispose_1.dispose(enumerator);\n group = null;\n });\n });\n };\n Enumerable.prototype.aggregate = function (func, seed) {\n return this.scan(func, seed).lastOrDefault();\n };\n Enumerable.prototype.average = function (selector) {\n if (selector === void 0) { selector = Types_1.default.numberOrNaN; }\n var count = 0;\n var sum = this.sum(function (e, i) {\n count++;\n return selector(e, i);\n });\n return (isNaN(sum) || !count)\n ? NaN\n : (sum / count);\n };\n Enumerable.prototype.max = function () {\n return this.aggregate(Functions.Greater);\n };\n Enumerable.prototype.min = function () {\n return this.aggregate(Functions.Lesser);\n };\n Enumerable.prototype.maxBy = function (keySelector) {\n if (keySelector === void 0) { keySelector = Functions.Identity; }\n return this.aggregate(function (a, b) { return (keySelector(a) > keySelector(b)) ? a : b; });\n };\n Enumerable.prototype.minBy = function (keySelector) {\n if (keySelector === void 0) { keySelector = Functions.Identity; }\n return this.aggregate(function (a, b) { return (keySelector(a) < keySelector(b)) ? a : b; });\n };\n Enumerable.prototype.sum = function (selector) {\n if (selector === void 0) { selector = Types_1.default.numberOrNaN; }\n var sum = 0;\n var sumInfinite = 0;\n this.forEach(function (x) {\n var value = selector(x);\n if (isNaN(value)) {\n sum = NaN;\n return false;\n }\n if (isFinite(value))\n sum += value;\n else\n sumInfinite +=\n value > 0 ?\n (+1) :\n (-1);\n });\n return isNaN(sum) ? NaN : (sumInfinite ? (sumInfinite * Infinity) : sum);\n };\n Enumerable.prototype.product = function (selector) {\n if (selector === void 0) { selector = Types_1.default.numberOrNaN; }\n var result = 1, exists = false;\n this.forEach(function (x, i) {\n exists = true;\n var value = selector(x, i);\n if (isNaN(value)) {\n result = NaN;\n return false;\n }\n if (value == 0) {\n result = 0;\n return false;\n }\n result *= value;\n });\n return (exists && isNaN(result)) ? NaN : result;\n };\n Enumerable.prototype.quotient = function (selector) {\n if (selector === void 0) { selector = Types_1.default.numberOrNaN; }\n var count = 0;\n var result = NaN;\n this.forEach(function (x, i) {\n var value = selector(x, i);\n count++;\n if (count === 1) {\n result = value;\n }\n else {\n if (isNaN(value) || value === 0 || !isFinite(value)) {\n result = NaN;\n return false;\n }\n result /= value;\n }\n });\n if (count === 1)\n result = NaN;\n return result;\n };\n Enumerable.prototype.last = function () {\n var _ = this;\n _.throwIfDisposed();\n var value = undefined;\n var found = false;\n _.forEach(function (x) {\n found = true;\n value = x;\n });\n if (!found)\n throw new Error(\"last:No element satisfies the condition.\");\n return value;\n };\n Enumerable.prototype.lastOrDefault = function (defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this;\n _.throwIfDisposed();\n var value = undefined;\n var found = false;\n _.forEach(function (x) {\n found = true;\n value = x;\n });\n return (!found) ? defaultValue : value;\n };\n Enumerable.prototype.share = function () {\n return _super.prototype.share.call(this);\n };\n Enumerable.prototype.catchError = function (handler) {\n return _super.prototype.catchError.call(this, handler);\n };\n Enumerable.prototype.finallyAction = function (action) {\n return _super.prototype.finallyAction.call(this, action);\n };\n Enumerable.prototype.memoize = function () {\n var _ = this, disposed = !_.throwIfDisposed();\n var cache;\n var enumerator;\n return new Enumerable(function () {\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n throwIfDisposed(disposed);\n if (!enumerator)\n enumerator = _.getEnumerator();\n if (!cache)\n cache = [];\n index = 0;\n }, function (yielder) {\n throwIfDisposed(disposed);\n var i = index++;\n if (i >= cache.length) {\n return (enumerator.moveNext())\n ? yielder.yieldReturn(cache[i] = enumerator.current)\n : false;\n }\n return yielder.yieldReturn(cache[i]);\n });\n }, function () {\n disposed = true;\n if (cache)\n cache.length = 0;\n cache = null;\n dispose_1.dispose(enumerator);\n enumerator = null;\n });\n };\n return Enumerable;\n }(InfiniteEnumerable));\n exports.Enumerable = Enumerable;\n var FiniteEnumerable = (function (_super) {\n __extends(FiniteEnumerable, _super);\n function FiniteEnumerable(enumeratorFactory, finalizer) {\n _super.call(this, enumeratorFactory, finalizer, false);\n }\n return FiniteEnumerable;\n }(Enumerable));\n exports.FiniteEnumerable = FiniteEnumerable;\n var ArrayEnumerable = (function (_super) {\n __extends(ArrayEnumerable, _super);\n function ArrayEnumerable(source) {\n _super.call(this, function () {\n _.throwIfDisposed();\n return new ArrayEnumerator_1.default(function () {\n _.throwIfDisposed(\"The underlying ArrayEnumerable was disposed.\", \"ArrayEnumerator\");\n return _._source;\n });\n });\n var _ = this;\n _._disposableObjectName = \"ArrayEnumerable\";\n _._source = source;\n }\n ArrayEnumerable.prototype._onDispose = function () {\n _super.prototype._onDispose.call(this);\n this._source = null;\n };\n Object.defineProperty(ArrayEnumerable.prototype, \"source\", {\n get: function () {\n return this._source;\n },\n enumerable: true,\n configurable: true\n });\n ArrayEnumerable.prototype.toArray = function () {\n var _ = this;\n _.throwIfDisposed();\n return Enumerator_1.toArray(_._source);\n };\n ArrayEnumerable.prototype.asEnumerable = function () {\n return new ArrayEnumerable(this._source);\n };\n ArrayEnumerable.prototype.forEach = function (action) {\n var _ = this;\n _.throwIfDisposed();\n Enumerator_1.forEach(_._source, action);\n };\n ArrayEnumerable.prototype.any = function (predicate) {\n var _ = this;\n _.throwIfDisposed();\n var source = _._source, len = source.length;\n return len && (!predicate || _super.prototype.any.call(this, predicate));\n };\n ArrayEnumerable.prototype.count = function (predicate) {\n var _ = this;\n _.throwIfDisposed();\n var source = _._source, len = source.length;\n return len && (predicate ? _super.prototype.count.call(this, predicate) : len);\n };\n ArrayEnumerable.prototype.elementAtOrDefault = function (index, defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this;\n _.throwIfDisposed();\n Integer_1.default.assertZeroOrGreater(index, 'index');\n var source = _._source;\n return index < source.length\n ? source[index]\n : defaultValue;\n };\n ArrayEnumerable.prototype.last = function () {\n var _ = this;\n _.throwIfDisposed();\n var source = _._source, len = source.length;\n return (len)\n ? source[len - 1]\n : _super.prototype.last.call(this);\n };\n ArrayEnumerable.prototype.lastOrDefault = function (defaultValue) {\n if (defaultValue === void 0) { defaultValue = null; }\n var _ = this;\n _.throwIfDisposed();\n var source = _._source, len = source.length;\n return len\n ? source[len - 1]\n : defaultValue;\n };\n ArrayEnumerable.prototype.skip = function (count) {\n var _ = this;\n if (!(count > 0))\n return _;\n return new Enumerable(function () { return new ArrayEnumerator_1.default(function () { return _._source; }, count); });\n };\n ArrayEnumerable.prototype.takeExceptLast = function (count) {\n if (count === void 0) { count = 1; }\n var _ = this;\n return _.take(_._source.length - count);\n };\n ArrayEnumerable.prototype.skipToLast = function (count) {\n if (!(count > 0))\n return Enumerable.empty();\n var _ = this;\n if (!isFinite(count))\n return _;\n var len = _._source\n ? _._source.length\n : 0;\n return _.skip(len - count);\n };\n ArrayEnumerable.prototype.reverse = function () {\n var _ = this;\n return new Enumerable(function () { return new ArrayEnumerator_1.default(function () { return _._source; }, _._source\n ? (_._source.length - 1)\n : 0, -1); });\n };\n ArrayEnumerable.prototype.memoize = function () {\n return this.asEnumerable();\n };\n ArrayEnumerable.prototype.sequenceEqual = function (second, equalityComparer) {\n if (equalityComparer === void 0) { equalityComparer = Values.areEqual; }\n if (Types_1.default.isArrayLike(second))\n return Arrays.areEqual(this.source, second, true, equalityComparer);\n if (second instanceof ArrayEnumerable)\n return second.sequenceEqual(this.source, equalityComparer);\n return _super.prototype.sequenceEqual.call(this, second, equalityComparer);\n };\n ArrayEnumerable.prototype.toJoinedString = function (separator, selector) {\n if (separator === void 0) { separator = \"\"; }\n if (selector === void 0) { selector = Functions.Identity; }\n var s = this._source;\n return !selector && Array.isArray(s)\n ? s.join(separator)\n : _super.prototype.toJoinedString.call(this, separator, selector);\n };\n return ArrayEnumerable;\n }(FiniteEnumerable));\n var Grouping = (function (_super) {\n __extends(Grouping, _super);\n function Grouping(_groupKey, elements) {\n _super.call(this, elements);\n this._groupKey = _groupKey;\n }\n Object.defineProperty(Grouping.prototype, \"key\", {\n get: function () {\n return this._groupKey;\n },\n enumerable: true,\n configurable: true\n });\n return Grouping;\n }(ArrayEnumerable));\n var Lookup = (function () {\n function Lookup(_dictionary) {\n this._dictionary = _dictionary;\n }\n Object.defineProperty(Lookup.prototype, \"count\", {\n get: function () {\n return this._dictionary.count;\n },\n enumerable: true,\n configurable: true\n });\n Lookup.prototype.get = function (key) {\n return this._dictionary.getValue(key);\n };\n Lookup.prototype.contains = function (key) {\n return this._dictionary.containsKey(key);\n };\n Lookup.prototype.getEnumerator = function () {\n var _ = this;\n var enumerator;\n return new EnumeratorBase_1.default(function () {\n enumerator = _._dictionary.getEnumerator();\n }, function (yielder) {\n if (!enumerator.moveNext())\n return false;\n var current = enumerator.current;\n return yielder.yieldReturn(new Grouping(current.key, current.value));\n }, function () {\n dispose_1.dispose(enumerator);\n });\n };\n return Lookup;\n }());\n var OrderedEnumerable = (function (_super) {\n __extends(OrderedEnumerable, _super);\n function OrderedEnumerable(source, keySelector, order, parent, comparer) {\n if (comparer === void 0) { comparer = Values.compare; }\n _super.call(this, null);\n this.source = source;\n this.keySelector = keySelector;\n this.order = order;\n this.parent = parent;\n this.comparer = comparer;\n Enumerator_1.throwIfEndless(source && source.isEndless);\n }\n OrderedEnumerable.prototype.createOrderedEnumerable = function (keySelector, order) {\n return new OrderedEnumerable(this.source, keySelector, order, this);\n };\n OrderedEnumerable.prototype.thenBy = function (keySelector) {\n return this.createOrderedEnumerable(keySelector, 1);\n };\n OrderedEnumerable.prototype.thenUsing = function (comparison) {\n return new OrderedEnumerable(this.source, null, 1, this, comparison);\n };\n OrderedEnumerable.prototype.thenByDescending = function (keySelector) {\n return this.createOrderedEnumerable(keySelector, -1);\n };\n OrderedEnumerable.prototype.thenUsingReversed = function (comparison) {\n return new OrderedEnumerable(this.source, null, -1, this, comparison);\n };\n OrderedEnumerable.prototype.getEnumerator = function () {\n var _ = this;\n var buffer;\n var indexes;\n var index = 0;\n return new EnumeratorBase_1.default(function () {\n index = 0;\n buffer = Enumerable.toArray(_.source);\n indexes = createSortContext(_).generateSortedIndexes(buffer);\n }, function (yielder) {\n return (index < indexes.length)\n ? yielder.yieldReturn(buffer[indexes[index++]])\n : false;\n }, function () {\n if (buffer)\n buffer.length = 0;\n buffer = null;\n if (indexes)\n indexes.length = 0;\n indexes = null;\n }, false);\n };\n OrderedEnumerable.prototype._onDispose = function () {\n _super.prototype._onDispose.call(this);\n this.source = null;\n this.keySelector = null;\n this.order = null;\n this.parent = null;\n };\n return OrderedEnumerable;\n }(FiniteEnumerable));\n function nextEnumerator(queue, e) {\n if (e) {\n if (e.moveNext()) {\n queue.enqueue(e);\n }\n else {\n dispose_1.dispose(e);\n e = null;\n }\n }\n return e;\n }\n function createSortContext(orderedEnumerable, currentContext) {\n if (currentContext === void 0) { currentContext = null; }\n var context = new KeySortedContext_1.default(currentContext, orderedEnumerable.keySelector, orderedEnumerable.order, orderedEnumerable.comparer);\n if (orderedEnumerable.parent)\n return createSortContext(orderedEnumerable.parent, context);\n return context;\n }\n function throwIfDisposed(disposed) {\n if (disposed)\n throw new ObjectDisposedException_1.default(\"Enumerable\");\n }\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports.default = Enumerable;\n});\n","/*!\r\n * @author electricessence / https://github.com/electricessence/\r\n * Original: http://linqjs.codeplex.com/\r\n * Licensing: MIT https://github.com/electricessence/TypeScript.NET/blob/master/LICENSE.md\r\n */\r\n\r\n///\r\n///\r\n///\r\n///\r\n///\r\n///\r\n///\r\n///\r\n///\r\n\r\nimport * as Values from \"../System/Compare\";\r\nimport * as Arrays from \"../System/Collections/Array/Compare\";\r\nimport * as ArrayUtility from \"../System/Collections/Array/Utility\";\r\nimport {\r\n\tempty as EmptyEnumerator,\r\n\tfrom as enumeratorFrom,\r\n\tforEach,\r\n\ttoArray,\r\n\tmap,\r\n\tisEnumerable,\r\n\tthrowIfEndless\r\n} from \"../System/Collections/Enumeration/Enumerator\";\r\nimport Type from \"../System/Types\";\r\nimport Integer from \"../System/Integer\";\r\nimport BaseFunctions from \"../System/Functions\";\r\nimport ArrayEnumerator from \"../System/Collections/Enumeration/ArrayEnumerator\";\r\nimport EnumeratorBase from \"../System/Collections/Enumeration/EnumeratorBase\";\r\nimport Dictionary from \"../System/Collections/Dictionaries/Dictionary\";\r\nimport Queue from \"../System/Collections/Queue\";\r\nimport {dispose, using} from \"../System/Disposable/dispose\";\r\nimport DisposableBase from \"../System/Disposable/DisposableBase\";\r\nimport UnsupportedEnumerableException from \"../System/Collections/Enumeration/UnsupportedEnumerableException\";\r\nimport ObjectDisposedException from \"../System/Disposable/ObjectDisposedException\";\r\nimport KeySortedContext from \"../System/Collections/Sorting/KeySortedContext\";\r\nimport ArgumentNullException from \"../System/Exceptions/ArgumentNullException\";\r\nimport ArgumentOutOfRangeException from \"../System/Exceptions/ArgumentOutOfRangeException\";\r\n\r\n// #region Local Constants.\r\n\r\nconst INVALID_DEFAULT:any = {}; // create a private unique instance for referencing.\r\nconst VOID0:any = void 0;\r\nconst BREAK:(e:any)=>EnumerableAction = element => EnumerableAction.Break;\r\n\r\n// Leave internal to avoid accidental overwriting.\r\nclass LinqFunctions extends BaseFunctions\r\n{\r\n\tGreater(a:T, b:T)\r\n\t{\r\n\t\treturn a>b ? a : b;\r\n\t}\r\n\r\n\tLesser(a:T, b:T)\r\n\t{\r\n\t\treturn a\r\n{\r\n\treturn EmptyEnumerator;\r\n}\r\n\r\n// #endregion\r\n\r\n/**\r\n * Defined values for doAction.\r\n */\r\nexport const enum EnumerableAction\r\n{\r\n\tBreak = 0,\r\n\tReturn = 1,\r\n\tSkip = 2\r\n}\r\n\r\n/*\r\n * NOTE: About InfiniteEnumerable and Enumerable.\r\n * There may seem like there's extra overrides here and they may seem unnecessary.\r\n * But after closer inspection you'll see the type chain is retained and\r\n * infinite enumerables are prevented from having features that finite ones have.\r\n *\r\n * I'm not sure if it's the best option to just use overrides, but it honors the typing properly.\r\n */\r\n\r\nexport class InfiniteEnumerable\r\nextends DisposableBase implements IEnumerable\r\n{\r\n\tconstructor(\r\n\t\tprotected _enumeratorFactory:() => IEnumerator,\r\n\t\tfinalizer?:() => void)\r\n\t{\r\n\t\tsuper(finalizer);\r\n\t\tthis._isEndless = true;\r\n\t}\r\n\r\n\tprotected _isEndless:boolean;\r\n\tget isEndless():boolean\r\n\t{\r\n\t\treturn this._isEndless;\r\n\t}\r\n\r\n\t// #region IEnumerable Implementation...\r\n\tgetEnumerator():IEnumerator\r\n\t{\r\n\r\n\t\tthis.throwIfDisposed();\r\n\r\n\t\treturn this._enumeratorFactory();\r\n\t}\r\n\r\n\t// #endregion\r\n\r\n\t// #region IDisposable override...\r\n\tprotected _onDispose():void\r\n\t{\r\n\t\tsuper._onDispose(); // Just in case.\r\n\t\tthis._enumeratorFactory = null;\r\n\t}\r\n\r\n\t// #endregion\r\n\r\n\t// Return a default (unfiltered) enumerable.\r\n\tasEnumerable():InfiniteEnumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\t\treturn new InfiniteEnumerable(() => _.getEnumerator());\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Similar to forEach, but executes an action for each time a value is enumerated.\r\n\t * If the action explicitly returns false or 0 (EnumerationAction.Break), the enumeration will complete.\r\n\t * If it returns a 2 (EnumerationAction.Skip) it will move on to the next item.\r\n\t * This also automatically handles disposing the enumerator.\r\n\t */\r\n\tdoAction(\r\n\t\taction:Action | Predicate | Selector | Selector,\r\n\t\tinitializer?:()=>void,\r\n\t\tisEndless:boolean = this.isEndless):InfiniteEnumerable\r\n\t{\r\n\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\tif(initializer) initializer();\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\t// May need a way to propagate isEndless\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\twhile(enumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar actionResult = action(enumerator.current, index++);\r\n\r\n\t\t\t\t\t\t\tif(actionResult===false || actionResult===EnumerableAction.Break)\r\n\t\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\r\n\t\t\t\t\t\t\tif(actionResult!==EnumerableAction.Skip) // || !== 2\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(enumerator.current);\r\n\r\n\t\t\t\t\t\t\t// If actionResult===2, then a signal for skip is received.\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\r\n\t\t\t},\r\n\t\t\t// Using a finalizer value reduces the chance of a circular reference\r\n\t\t\t// since we could simply reference the enumeration and check e.wasDisposed.\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tdisposed = true;\r\n\t\t\t},\r\n\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tforce():void\r\n\t{\r\n\t\tthis.throwIfDisposed();\r\n\t\tthis.doAction(BREAK)\r\n\t\t\t.getEnumerator()\r\n\t\t\t.moveNext();\r\n\r\n\t}\r\n\r\n\t// #region Indexing/Paging methods.\r\n\tskip(count:number):InfiniteEnumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\tif(!isFinite(count)) // +Infinity equals skip all so return empty.\r\n\t\t\treturn Enumerable.empty();\r\n\r\n\t\tInteger.assert(count, \"count\");\r\n\r\n\t\treturn this.doAction(\r\n\t\t\t(element:T, index?:number) =>\r\n\t\t\t\tindex\r\n\t{\r\n\t\tif(!(count>0)) // Out of bounds? Empty.\r\n\t\t\treturn Enumerable.empty();\r\n\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\tif(!isFinite(count))\r\n\t\t\tthrow new ArgumentOutOfRangeException('count', count, 'Must be finite.');\r\n\r\n\t\tInteger.assert(count, \"count\");\r\n\r\n\t\t// Once action returns false, the enumeration will stop.\r\n\t\treturn >_.doAction((element:T, index?:number) => index\r\n\t\t\t{\r\n\t\t\t\tvar i = 0;\r\n\t\t\t\twhile(e.moveNext())\r\n\t\t\t\t{\r\n\t\t\t\t\tif(i==n) return e.current;\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t});\r\n\t}\r\n\r\n\t/* Note: Unlike previous implementations, you could pass a predicate into these methods.\r\n\t * But since under the hood it ends up calling .where(predicate) anyway,\r\n\t * it may be better to remove this to allow for a cleaner signature/override.\r\n\t * JavaScript/TypeScript does not easily allow for a strict method interface like C#.\r\n\t * Having to write extra override logic is error prone and confusing to the consumer.\r\n\t * Removing the predicate here may also cause the consumer of this method to think more about how they structure their query.\r\n\t * The end all difference is that the user must declare .where(predicate) before .first(), .single(), or .last().\r\n\t * */\r\n\r\n\tfirst():T\r\n\t{\r\n\t\tvar v = this.firstOrDefault(INVALID_DEFAULT);\r\n\t\tif(v===INVALID_DEFAULT) throw new Error(\"first:The sequence is empty.\");\r\n\t\treturn v;\r\n\t}\r\n\r\n\tfirstOrDefault(defaultValue:T = null):T\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\treturn using(\r\n\t\t\tthis.getEnumerator(),\r\n\t\t\te=> e.moveNext() ? e.current : defaultValue\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tsingle():T\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\treturn using(\r\n\t\t\tthis.getEnumerator(),\r\n\t\t\te=>\r\n\t\t\t{\r\n\t\t\t\tif(e.moveNext())\r\n\t\t\t\t{\r\n\t\t\t\t\tvar value = e.current;\r\n\t\t\t\t\tif(!e.moveNext()) return value;\r\n\t\t\t\t\tthrow new Error(\"single:sequence contains more than one element.\");\r\n\t\t\t\t}\r\n\t\t\t\tthrow new Error(\"single:The sequence is empty.\");\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tsingleOrDefault(defaultValue:T = null):T\r\n\t{\r\n\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\treturn using(\r\n\t\t\tthis.getEnumerator(),\r\n\t\t\te=>\r\n\t\t\t{\r\n\t\t\t\tif(e.moveNext())\r\n\t\t\t\t{\r\n\t\t\t\t\tvar value = e.current;\r\n\t\t\t\t\tif(!e.moveNext()) return value;\r\n\t\t\t\t}\r\n\t\t\t\treturn defaultValue;\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tany():boolean\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\treturn using(\r\n\t\t\tthis.getEnumerator(),\r\n\t\t\te=> e.moveNext()\r\n\t\t);\r\n\t}\r\n\r\n\tisEmpty():boolean\r\n\t{\r\n\t\treturn !this.any();\r\n\t}\r\n\r\n\t// #endregion\r\n\r\n\r\n\t// #region Projection and Filtering Methods\r\n\r\n\ttraverseBreadthFirst(\r\n\t\tchildrenSelector:(element:T) => IEnumerableOrArray):Enumerable;\r\n\r\n\ttraverseBreadthFirst(\r\n\t\tchildrenSelector:(element:T|TNode) => IEnumerableOrArray):Enumerable;\r\n\r\n\ttraverseBreadthFirst(\r\n\t\tchildrenSelector:(element:T) => IEnumerableOrArray,\r\n\t\tresultSelector?:(element:T, nestLevel?:number) => TResult):Enumerable;\r\n\r\n\ttraverseBreadthFirst(\r\n\t\tchildrenSelector:(element:T|TNode) => IEnumerableOrArray,\r\n\t\tresultSelector?:(element:TNode, nestLevel?:number) => TResult):Enumerable;\r\n\r\n\ttraverseBreadthFirst(\r\n\t\tchildrenSelector:(element:T|TNode) => IEnumerableOrArray,\r\n\t\tresultSelector:(\r\n\t\t\telement:TNode,\r\n\t\t\tnestLevel?:number) => any = Functions.Identity):Enumerable\r\n\t{\r\n\t\tvar _ = this, isEndless = _._isEndless || null; // Is endless is not affirmative if false.\r\n\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar nestLevel:number = 0;\r\n\t\t\t\tvar buffer:any[], len:number;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tnestLevel = 0;\r\n\t\t\t\t\t\tbuffer = [];\r\n\t\t\t\t\t\tlen = 0;\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twhile(true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(enumerator.moveNext())\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tbuffer[len++] = enumerator.current;\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(resultSelector(enumerator.current, nestLevel));\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif(!len)\r\n\t\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\r\n\t\t\t\t\t\t\tvar next = Enumerable\r\n\t\t\t\t\t\t\t\t.from(buffer)\r\n\t\t\t\t\t\t\t\t.selectMany(childrenSelector);\r\n\r\n\t\t\t\t\t\t\tif(!next.any())\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tnestLevel++;\r\n\t\t\t\t\t\t\t\tbuffer = [];\r\n\t\t\t\t\t\t\t\tlen = 0;\r\n\t\t\t\t\t\t\t\tenumerator.dispose();\r\n\t\t\t\t\t\t\t\tenumerator = next.getEnumerator();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t\tbuffer.length = 0;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\r\n\ttraverseDepthFirst(\r\n\t\tchildrenSelector:(element:T) => IEnumerableOrArray):Enumerable;\r\n\r\n\ttraverseDepthFirst(\r\n\t\tchildrenSelector:(element:T|TNode) => IEnumerableOrArray):Enumerable;\r\n\r\n\ttraverseDepthFirst(\r\n\t\tchildrenSelector:(element:T) => IEnumerableOrArray,\r\n\t\tresultSelector?:(element:T, nestLevel?:number) => TResult):Enumerable;\r\n\r\n\ttraverseDepthFirst(\r\n\t\tchildrenSelector:(element:T|TNode) => IEnumerableOrArray,\r\n\t\tresultSelector?:(element:TNode, nestLevel?:number) => TResult):Enumerable;\r\n\r\n\ttraverseDepthFirst(\r\n\t\tchildrenSelector:(element:T|TNode) => IEnumerableOrArray,\r\n\t\tresultSelector:(\r\n\t\t\telement:TNode,\r\n\t\t\tnestLevel?:number) => any = Functions.Identity):Enumerable\r\n\t{\r\n\t\tvar _ = this, isEndless = _._isEndless || null; // Is endless is not affirmative if false.\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\t// Dev Note: May want to consider using an actual stack and not an array.\r\n\t\t\t\tvar enumeratorStack:IEnumerator[] = [];\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar len:number; // Avoid using push/pop since they query .length every time and can be slower.\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tlen = 0;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twhile(true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(enumerator.moveNext())\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tlet value = resultSelector(enumerator.current, len);\r\n\t\t\t\t\t\t\t\tenumeratorStack[len++] = enumerator;\r\n\t\t\t\t\t\t\t\tlet e = Enumerable.fromAny(childrenSelector(enumerator.current));\r\n\t\t\t\t\t\t\t\tenumerator = e ? e.getEnumerator() : EmptyEnumerator;\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(value);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif(len==0) return false;\r\n\r\n\t\t\t\t\t\t\tenumerator.dispose();\r\n\t\t\t\t\t\t\tenumerator = enumeratorStack[--len];\r\n\t\t\t\t\t\t\tenumeratorStack.length = len;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttry\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfinally\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tdispose.these(enumeratorStack);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tflatten():Enumerable\r\n\t{\r\n\t\tvar _ = this, isEndless = _._isEndless || null; // Is endless is not affirmative if false.;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar middleEnumerator:IEnumerator = null;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twhile(true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(middleEnumerator)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tif(middleEnumerator.moveNext())\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\treturn yielder.yieldReturn(middleEnumerator.current);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tmiddleEnumerator.dispose();\r\n\t\t\t\t\t\t\t\t\tmiddleEnumerator = null;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif(enumerator.moveNext())\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tvar c = enumerator.current;\r\n\t\t\t\t\t\t\t\t// Because strings are enumerable, we can get stuck in an infinite loop.\r\n\t\t\t\t\t\t\t\t// Treat strings as primitives here.\r\n\t\t\t\t\t\t\t\tvar e = !Type.isString(c) && Enumerable.fromAny(c);\r\n\t\t\t\t\t\t\t\tif(e)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tmiddleEnumerator\r\n\t\t\t\t\t\t\t\t\t\t= e\r\n\t\t\t\t\t\t\t\t\t\t.selectMany(Functions.Identity)\r\n\t\t\t\t\t\t\t\t\t\t.flatten()\r\n\t\t\t\t\t\t\t\t\t\t.getEnumerator();\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\treturn yielder.yieldReturn(c);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator, middleEnumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tpairwise(selector:(prev:T, current:T) => TSelect):Enumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tenumerator.moveNext();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar prev = enumerator.current;\r\n\t\t\t\t\t\treturn enumerator.moveNext()\r\n\t\t\t\t\t\t\t&& yielder.yieldReturn(selector(prev, enumerator.current));\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\tscan(func:(a:T, b:T) => T, seed?:T):Enumerable\r\n\t{\r\n\r\n\t\tvar isUseSeed = seed!==VOID0; // For now...\r\n\t\tvar _ = this;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar value:T;\r\n\t\t\t\tvar isFirst:boolean;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tisFirst = true;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(isFirst)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tisFirst = false;\r\n\t\t\t\t\t\t\t//noinspection JSUnusedAssignment\r\n\t\t\t\t\t\t\treturn isUseSeed\r\n\t\t\t\t\t\t\t\t? yielder.yieldReturn(value = seed)\r\n\t\t\t\t\t\t\t\t: enumerator.moveNext() && yielder.yieldReturn(value\r\n\t\t\t\t\t\t\t\t= enumerator.current);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn (enumerator.moveNext())\r\n\t\t\t\t\t\t\t? yielder.yieldReturn(value = func(value, enumerator.current))\r\n\t\t\t\t\t\t\t: false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\t// #endregion\r\n\r\n\tselect(selector:Selector):InfiniteEnumerable\r\n\t{\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\treturn enumerator.moveNext()\r\n\t\t\t\t\t\t\t? yielder.yieldReturn(selector(enumerator.current, index++))\r\n\t\t\t\t\t\t\t: yielder.yieldBreak();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tdisposed = true;\r\n\t\t\t},\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\t/*\r\n\tpublic static IEnumerable SelectMany(\r\n\t\tthis IEnumerable source,\r\n\t\tFunc> collectionSelector,\r\n\t\tFunc resultSelector)\r\n\t */\r\n\r\n\tprotected _selectMany(\r\n\t\tcollectionSelector:Selector>,\r\n\t\tresultSelector?:(collection:T, element:TElement) => TResult):Enumerable\r\n\t{\r\n\t\tvar _ = this, isEndless = _._isEndless || null; // Do second enumeration, it will be indeterminate if false.\r\n\t\tif(!resultSelector)\r\n\t\t\tresultSelector = (a:T, b:any) => b;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar middleEnumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tmiddleEnumerator = undefined;\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\r\n\t\t\t\t\t\t// Just started, and nothing to enumerate? End.\r\n\t\t\t\t\t\tif(middleEnumerator===VOID0 && !enumerator.moveNext())\r\n\t\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t\t// moveNext has been called at least once...\r\n\t\t\t\t\t\tdo\r\n\t\t\t\t\t\t{\r\n\r\n\t\t\t\t\t\t\t// Initialize middle if there isn't one.\r\n\t\t\t\t\t\t\tif(!middleEnumerator)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tvar middleSeq = collectionSelector(enumerator.current, index++);\r\n\r\n\t\t\t\t\t\t\t\t// Collection is null? Skip it...\r\n\t\t\t\t\t\t\t\tif(!middleSeq)\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t\tmiddleEnumerator = enumeratorFrom(middleSeq);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif(middleEnumerator.moveNext())\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(\r\n\t\t\t\t\t\t\t\t\tresultSelector(\r\n\t\t\t\t\t\t\t\t\t\tenumerator.current, middleEnumerator.current\r\n\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t// else no more in this middle? Then clear and reset for next...\r\n\r\n\t\t\t\t\t\t\tmiddleEnumerator.dispose();\r\n\t\t\t\t\t\t\tmiddleEnumerator = null;\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twhile(enumerator.moveNext());\r\n\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator, middleEnumerator);\r\n\t\t\t\t\t\tenumerator = null;\r\n\t\t\t\t\t\tmiddleEnumerator = null;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\tselectMany(\r\n\t\tcollectionSelector:Selector>):InfiniteEnumerable;\r\n\r\n\tselectMany(\r\n\t\tcollectionSelector:Selector>,\r\n\t\tresultSelector:(collection:T, element:TElement) => TResult):InfiniteEnumerable;\r\n\r\n\tselectMany(\r\n\t\tcollectionSelector:Selector>,\r\n\t\tresultSelector?:(collection:T, element:any) => TResult):InfiniteEnumerable\r\n\t{\r\n\t\treturn this._selectMany(collectionSelector, resultSelector);\r\n\t}\r\n\r\n\tprotected _choose(selector:Selector):Enumerable\r\n\t{\r\n\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\twhile(enumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar result = selector(enumerator.current, index++);\r\n\t\t\t\t\t\t\tif(result!==null && result!==VOID0)\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(result);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tdisposed = true;\r\n\t\t\t},\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Returns selected values that are not null or undefined.\r\n\t */\r\n\tchoose():InfiniteEnumerable;\r\n\tchoose(selector?:Selector):InfiniteEnumerable\r\n\tchoose(selector:Selector = Functions.Identity):InfiniteEnumerable\r\n\t{\r\n\t\treturn this._choose(selector)\r\n\t}\r\n\r\n\twhere(predicate:Predicate):InfiniteEnumerable\r\n\t{\r\n\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\twhile(enumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(predicate(enumerator.current, index++))\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(enumerator.current);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tdisposed = true;\r\n\t\t\t},\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\r\n\t}\r\n\r\n\tofType(type:{ new (...params:any[]):TType }):InfiniteEnumerable;\r\n\tofType(type:any):InfiniteEnumerable\r\n\t{\r\n\t\tvar typeName:string;\r\n\t\tswitch(type)\r\n\t\t{\r\n\t\t\tcase Number:\r\n\t\t\t\ttypeName = Type.NUMBER;\r\n\t\t\t\tbreak;\r\n\t\t\tcase String:\r\n\t\t\t\ttypeName = Type.STRING;\r\n\t\t\t\tbreak;\r\n\t\t\tcase Boolean:\r\n\t\t\t\ttypeName = Type.BOOLEAN;\r\n\t\t\t\tbreak;\r\n\t\t\tcase Function:\r\n\t\t\t\ttypeName = Type.FUNCTION;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\treturn >this\r\n\t\t\t\t\t.where(x=>x instanceof type);\r\n\t\t}\r\n\t\treturn >this\r\n\t\t\t.choose()\r\n\t\t\t.where(x=>(typeof x)===typeName);\r\n\t}\r\n\r\n\texcept(\r\n\t\tsecond:IEnumerableOrArray,\r\n\t\tcompareSelector?:Selector):InfiniteEnumerable\r\n\t{\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar keys:Dictionary;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tkeys = new Dictionary(compareSelector);\r\n\t\t\t\t\t\tif(second)\r\n\t\t\t\t\t\t\tforEach(second, key => keys.addByKeyValue(key, true));\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\t\t\t\t\t\twhile(enumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar current = enumerator.current;\r\n\t\t\t\t\t\t\tif(!keys.containsKey(current))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tkeys.addByKeyValue(current, true);\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(current);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t\tkeys.clear();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tdisposed = true;\r\n\t\t\t},\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\tdistinct(compareSelector?:(value:T) => T):InfiniteEnumerable\r\n\t{\r\n\t\treturn this.except(null, compareSelector);\r\n\t}\r\n\r\n\t// [0,0,0,1,1,1,2,2,2,0,0,0,1,1] results in [0,1,2,0,1];\r\n\tdistinctUntilChanged(compareSelector:Selector = Functions.Identity):InfiniteEnumerable\r\n\t{\r\n\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar compareKey:TCompare;\r\n\t\t\t\tvar initial:boolean = true;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\t\t\t\t\t\twhile(enumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tvar key = compareSelector(enumerator.current);\r\n\r\n\t\t\t\t\t\t\tif(initial)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tinitial = false;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse if(Values.areEqual(compareKey,key))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tcompareKey = key;\r\n\t\t\t\t\t\t\treturn yielder.yieldReturn(enumerator.current);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tdisposed = true;\r\n\t\t\t},\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Returns a single default value if empty.\r\n\t * @param defaultValue\r\n\t * @returns {Enumerable}\r\n\t */\r\n\tdefaultIfEmpty(defaultValue:T = null):Enumerable\r\n\t{\r\n\t\tvar _ = this, disposed:boolean = !_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar isFirst:boolean;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tisFirst = true;\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthrowIfDisposed(disposed);\r\n\r\n\t\t\t\t\t\tif(enumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tisFirst = false;\r\n\t\t\t\t\t\t\treturn yielder.yieldReturn(enumerator.current);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if(isFirst)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tisFirst = false;\r\n\t\t\t\t\t\t\treturn yielder.yieldReturn(defaultValue);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\tzip(\r\n\t\tsecond:IEnumerableOrArray,\r\n\t\tresultSelector:(first:T, second:TSecond, index?:number) => TResult):Enumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar firstEnumerator:IEnumerator;\r\n\t\t\t\tvar secondEnumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t\tfirstEnumerator = _.getEnumerator();\r\n\t\t\t\t\t\tsecondEnumerator = enumeratorFrom(second);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=> firstEnumerator.moveNext()\r\n\t\t\t\t\t&& secondEnumerator.moveNext()\r\n\t\t\t\t\t&& yielder.yieldReturn(resultSelector(firstEnumerator.current, secondEnumerator.current, index++)),\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(firstEnumerator, secondEnumerator);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tzipMultiple(\r\n\t\tsecond:IArray>,\r\n\t\tresultSelector:(first:T, second:TSecond, index?:number) => TResult):Enumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\tif(!second.length)\r\n\t\t\treturn Enumerable.empty();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar secondTemp:Queue;\r\n\t\t\t\tvar firstEnumerator:IEnumerator;\r\n\t\t\t\tvar secondEnumerator:IEnumerator;\r\n\t\t\t\tvar index:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tsecondTemp = new Queue(second);\r\n\t\t\t\t\t\tindex = 0;\r\n\t\t\t\t\t\tfirstEnumerator = _.getEnumerator();\r\n\t\t\t\t\t\tsecondEnumerator = null;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(firstEnumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twhile(true)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\twhile(!secondEnumerator)\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tif(secondTemp.count)\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tvar next = secondTemp.dequeue();\r\n\t\t\t\t\t\t\t\t\t\tif(next) // In case by chance next is null, then try again.\r\n\t\t\t\t\t\t\t\t\t\t\tsecondEnumerator = enumeratorFrom(next);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tif(secondEnumerator.moveNext())\r\n\t\t\t\t\t\t\t\t\treturn yielder.yieldReturn(\r\n\t\t\t\t\t\t\t\t\t\tresultSelector(firstEnumerator.current, secondEnumerator.current, index++)\r\n\t\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t\tsecondEnumerator.dispose();\r\n\t\t\t\t\t\t\t\tsecondEnumerator = null;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(firstEnumerator, secondTemp);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\r\n\t// #region Join Methods\r\n\r\n\tjoin(\r\n\t\tinner:IEnumerableOrArray,\r\n\t\touterKeySelector:Selector,\r\n\t\tinnerKeySelector:Selector,\r\n\t\tresultSelector:(outer:T, inner:TInner) => TResult,\r\n\t\tcompareSelector:Selector = Functions.Identity):Enumerable\r\n\t{\r\n\r\n\t\tvar _ = this;\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar outerEnumerator:IEnumerator;\r\n\t\t\t\tvar lookup:ILookup;\r\n\t\t\t\tvar innerElements:TInner[] = null;\r\n\t\t\t\tvar innerCount:number = 0;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\touterEnumerator = _.getEnumerator();\r\n\t\t\t\t\t\tlookup = Enumerable.from(inner)\r\n\t\t\t\t\t\t\t.toLookup(innerKeySelector, Functions.Identity, compareSelector);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twhile(true)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif(innerElements!=null)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tvar innerElement = innerElements[innerCount++];\r\n\t\t\t\t\t\t\t\tif(innerElement!==VOID0)\r\n\t\t\t\t\t\t\t\t\treturn yielder.yieldReturn(resultSelector(outerEnumerator.current, innerElement));\r\n\r\n\t\t\t\t\t\t\t\tinnerElement = null;\r\n\t\t\t\t\t\t\t\tinnerCount = 0;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif(outerEnumerator.moveNext())\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tvar key = outerKeySelector(outerEnumerator.current);\r\n\t\t\t\t\t\t\t\tinnerElements = lookup.get(key);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(outerEnumerator);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tgroupJoin(\r\n\t\tinner:IEnumerableOrArray,\r\n\t\touterKeySelector:Selector,\r\n\t\tinnerKeySelector:Selector,\r\n\t\tresultSelector:(outer:T, inner:TInner[]) => TResult,\r\n\t\tcompareSelector:Selector = Functions.Identity):Enumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar lookup:ILookup = null;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tlookup = Enumerable.from(inner)\r\n\t\t\t\t\t\t\t.toLookup(innerKeySelector, Functions.Identity, compareSelector);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\tenumerator.moveNext()\r\n\t\t\t\t\t&& yielder.yieldReturn(\r\n\t\t\t\t\t\tresultSelector(\r\n\t\t\t\t\t\t\tenumerator.current,\r\n\t\t\t\t\t\t\tlookup.get(outerKeySelector(enumerator.current))\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t),\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tmerge(enumerables:IArray>):InfiniteEnumerable\r\n\t{\r\n\t\tvar _ = this, isEndless = _._isEndless || null;\r\n\r\n\t\tif(!enumerables || enumerables.length==0)\r\n\t\t\treturn _;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\t\t\t\tvar queue:Queue>;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// 1) First get our values...\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\t\t\t\t\t\tqueue = new Queue>(enumerables);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder) =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twhile(true)\r\n\t\t\t\t\t\t{\r\n\r\n\t\t\t\t\t\t\twhile(!enumerator && queue.count)\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tenumerator = enumeratorFrom(queue.dequeue()); // 4) Keep going and on to step 2. Else fall through to yieldBreak().\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif(enumerator && enumerator.moveNext()) // 2) Keep returning until done.\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(enumerator.current);\r\n\r\n\t\t\t\t\t\t\tif(enumerator) // 3) Dispose and reset for next.\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tenumerator.dispose();\r\n\t\t\t\t\t\t\t\tenumerator = null;\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator, queue); // Just in case this gets disposed early.\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\tconcat(...enumerables:Array>):InfiniteEnumerable\r\n\t{\r\n\t\treturn this.merge(enumerables);\r\n\t}\r\n\r\n\r\n\tunion(\r\n\t\tsecond:IEnumerableOrArray,\r\n\t\tcompareSelector:Selector = Functions.Identity):Enumerable\r\n\t{\r\n\t\tvar _ = this, isEndless = _._isEndless || null;\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar firstEnumerator:IEnumerator;\r\n\t\t\t\tvar secondEnumerator:IEnumerator;\r\n\t\t\t\tvar keys:Dictionary;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tfirstEnumerator = _.getEnumerator();\r\n\t\t\t\t\t\tkeys = new Dictionary(compareSelector); // Acting as a HashSet.\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tvar current:T;\r\n\t\t\t\t\t\tif(secondEnumerator===VOID0)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twhile(firstEnumerator.moveNext())\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tcurrent = firstEnumerator.current;\r\n\t\t\t\t\t\t\t\tif(!keys.containsKey(current))\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\tkeys.addByKeyValue(current, null);\r\n\t\t\t\t\t\t\t\t\treturn yielder.yieldReturn(current);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsecondEnumerator = enumeratorFrom(second);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twhile(secondEnumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tcurrent = secondEnumerator.current;\r\n\t\t\t\t\t\t\tif(!keys.containsKey(current))\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tkeys.addByKeyValue(current, null);\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(current);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(firstEnumerator, secondEnumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\tinsertAt(index:number, other:IEnumerableOrArray):Enumerable\r\n\t{\r\n\t\tInteger.assertZeroOrGreater(index,'index');\r\n\t\tvar n:number = index;\r\n\r\n\t\tvar _ = this, isEndless = _._isEndless || null;\r\n\t\t_.throwIfDisposed();\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\r\n\t\t\t\tvar firstEnumerator:IEnumerator;\r\n\t\t\t\tvar secondEnumerator:IEnumerator;\r\n\r\n\t\t\t\tvar count:number = 0;\r\n\t\t\t\tvar isEnumerated:boolean = false;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcount = 0;\r\n\t\t\t\t\t\tfirstEnumerator = _.getEnumerator();\r\n\t\t\t\t\t\tsecondEnumerator = enumeratorFrom(other);\r\n\t\t\t\t\t\tisEnumerated = false;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder) =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif(count==n)\r\n\t\t\t\t\t\t{ // Inserting?\r\n\t\t\t\t\t\t\tisEnumerated = true;\r\n\t\t\t\t\t\t\tif(secondEnumerator.moveNext())\r\n\t\t\t\t\t\t\t\treturn yielder.yieldReturn(secondEnumerator.current);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif(firstEnumerator.moveNext())\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tcount++;\r\n\t\t\t\t\t\t\treturn yielder.yieldReturn(firstEnumerator.current);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn !isEnumerated\r\n\t\t\t\t\t\t\t&& secondEnumerator.moveNext()\r\n\t\t\t\t\t\t\t&& yielder.yieldReturn(secondEnumerator.current);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(firstEnumerator, secondEnumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tisEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\tisEndless\r\n\t\t);\r\n\t}\r\n\r\n\r\n\talternateMultiple(sequence:IEnumerableOrArray):Enumerable\r\n\t{\r\n\t\tvar _ = this;\r\n\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar buffer:T,\r\n\t\t\t\t mode:EnumerableAction,\r\n\t\t\t\t enumerator:IEnumerator,\r\n\t\t\t\t alternateEnumerator:IEnumerator;\r\n\r\n\t\t\t\treturn new EnumeratorBase(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// Instead of recalling getEnumerator every time, just reset the existing one.\r\n\t\t\t\t\t\talternateEnumerator = new ArrayEnumerator(\r\n\t\t\t\t\t\t\tEnumerable.toArray(sequence)\r\n\t\t\t\t\t\t); // Freeze\r\n\r\n\t\t\t\t\t\tenumerator = _.getEnumerator();\r\n\r\n\t\t\t\t\t\tvar hasAtLeastOne = enumerator.moveNext();\r\n\t\t\t\t\t\tmode = hasAtLeastOne\r\n\t\t\t\t\t\t\t? EnumerableAction.Return\r\n\t\t\t\t\t\t\t: EnumerableAction.Break;\r\n\r\n\t\t\t\t\t\tif(hasAtLeastOne)\r\n\t\t\t\t\t\t\tbuffer = enumerator.current;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t(yielder)=>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tswitch(mode)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tcase EnumerableAction.Break: // We're done?\r\n\t\t\t\t\t\t\t\treturn yielder.yieldBreak();\r\n\r\n\t\t\t\t\t\t\tcase EnumerableAction.Skip:\r\n\t\t\t\t\t\t\t\tif(alternateEnumerator.moveNext())\r\n\t\t\t\t\t\t\t\t\treturn yielder.yieldReturn(alternateEnumerator.current);\r\n\t\t\t\t\t\t\t\talternateEnumerator.reset();\r\n\t\t\t\t\t\t\t\tmode = EnumerableAction.Return;\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar latest = buffer;\r\n\r\n\t\t\t\t\t\t// Set up the next round...\r\n\r\n\t\t\t\t\t\t// Is there another one? Set the buffer and setup instruct for the next one to be the alternate.\r\n\t\t\t\t\t\tvar another = enumerator.moveNext();\r\n\t\t\t\t\t\tmode = another\r\n\t\t\t\t\t\t\t? EnumerableAction.Skip\r\n\t\t\t\t\t\t\t: EnumerableAction.Break;\r\n\r\n\t\t\t\t\t\tif(another)\r\n\t\t\t\t\t\t\tbuffer = enumerator.current;\r\n\r\n\t\t\t\t\t\treturn yielder.yieldReturn(latest);\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdispose(enumerator, alternateEnumerator);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t_._isEndless\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\tnull,\r\n\r\n\t\t\t_._isEndless\r\n\t\t);\r\n\t}\r\n\r\n\talternateSingle(value:T):Enumerable\r\n\t{\r\n\t\treturn this.alternateMultiple(Enumerable.make(value));\r\n\t}\r\n\r\n\talternate(...sequence:T[]):Enumerable\r\n\t{\r\n\t\treturn this.alternateMultiple(sequence);\r\n\t}\r\n\r\n\r\n\t// #region Error Handling\r\n\tcatchError(handler:(e:any) => void):InfiniteEnumerable\r\n\t{\r\n\t\tvar _ = this, disposed = !_.throwIfDisposed();\r\n\t\treturn new Enumerable(\r\n\t\t\t() =>\r\n\t\t\t{\r\n\t\t\t\tvar enumerator:IEnumerator;\r\n\r\n\t\t\t\treturn new EnumeratorBase